`
daly1987
  • 浏览: 7407 次
文章分类
社区版块
存档分类
最新评论

GCC静态链接和动态链接

 
阅读更多
写在前面:最近因为需要在不同版本的linux上运行编译后的文件,经常会遇到找不到需要的链接库文件的问题,后来突然想起了静态编译这一说。

1:建静态库

/*  hellos.h  */

#ifndef _HELLO_S_H

#define _HELLO_S_H

void printS(char* str);

#endif

/*  hellos.c  */

#include "hellos.h"

void printS(char* str)

{

    printf("print in static way: %s", str);

}

输入命令:

gcc -c -o hellos.o hellos.c

ar cqs libhellos.a hellos.o      //ar是生成库的命令,cqs是参数, libhellos.a是生成的静态链接库须以lib开头,hellos是库名,a表示是静态链接库,hellos.o是刚才生成目标文件。于是得到了libhellos.a这么一个静态链接库



2:主程序

/*  main.c  */

#include <stdio.h>

#include "hellos.h"



main()

{

    char* text = "Hello World!\n";

    printS(text);

}



编译链接:

gcc -o hello main.c -static -L. –lhellos

下面是关于上面命令的解释:

库依赖

使用-I参数可以向gcc的头文件搜索路径中添加新目录。

gcc hello.c -I /home/wuzhiguo/include -o hello

使用-L参数可以向gcc的库文件搜索路径中添加新目录。

gcc hello.c -L /home/wuzhiguo/lib -l mylib -o hello

-l mylib 是指示gcc去链接库文件libmylib.so。Linux下的库文件有一个约定,全部以lib开头,因此可以省去lib。

动态库:.so结尾,在运行时加载。

静态库:.a结尾,在编译时加载。

默认gcc优先加载动态库,可以在通过-static选项强制使用静态链接库。

gcc hello.c -L /home/wuzhiguo/lib -static -l mylib -o hello

       所以-L后面的点为当前目录,-l后面是要静态连接的库(libhellos.a)



然后运行hello可以看到输出

print in static way: Hello World!

删除libhellos.a和hellos.*后, 程序仍然正常运行。



下面再来看动态链接

3:建动态库

/*  hellod.h  */

#ifndef _HELLO_D_H

#define _HELLO_D_H

void printD(char* str);

#endif

/*  hellod.c  */

#include "hellod.h"

void printD(char* str)

{

    printf("print in dynamic way: %s", str);

}

输入命令:

gcc -shared -o libhellod.so hellod.c

于是得到了libhellod.so这么一个动态链接库,然后复制到/lib目录中,否则运行的时候找不到库文件。



4:主程序

/*  main.c  */

#include <stdio.h>

#include "hellod.h"

main()

{

    char* text = "Hello World!\n";

    printD(text);

}



编译链接:

gcc -o hello main.c -L. -lhellod

然后运行hello可以看到输出

print in dynamic way: Hello World!

如果这时候删除刚刚生成的libhellod.so,再运行则会报告一个找不到libhellod.so的错误,程序无法正常运行。

gcc -g -lstdc++ -g -WI,-Bdynamic -L. -lmy  -WI,-Bstatic -L. -lmy -o test.exe main.cc
分享到:
评论

相关推荐

    GCC编译动态和静态链接库.pdf

    GCC编译动态和静态链接库.pdf 学习资料 复习资料 教学资源

    gcc编译动态和静态链接库

    转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。

    gcc常用参数(静动态链接 优化 调试)

    介绍gcc下常用的一些参数,包括预编译、编译、汇编和链接,以及优化和调试。静态链接与动态链接的内容。绝对原创!!

    GCC 编译使用动态链接库和静态链接库的方法

    根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态...

    动态和静态链接库

    gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力

    使用gcc建立并调用静态库与动态库

    用GCC编译器制作静态库和动态库的方法简介。

    stm32代码在ubuntu linux使用gcc编译的链接文件

    stm32代码在ubuntu linux使用gcc编译的链接文件 link.ld 具体参考博客: http://blog.csdn.net/embbnux/

    静态库和动态库:.doc

    源码经过编译生成对象文件,对象文件进一步处理可以生成可执行程序或者库文件。...对于可执行程序和动态库,此“进一步处理”指的是“链接”,使用gcc命令。 对于静态库,此“进一步处理”指的是“打包”,使用ar命令。

    再议GCC编译时的静态库依赖次顺问题

    这是最常规的解决办法,除此之外,只需要加入--start-group和--end-group两个链接参数,即可保持被依赖的库放在前头,也就是改成如下即可:g++ -g -o $@ -Wl,--start-group $^ -Wl,--end-group。 这里的“-Wl,”...

    grpc-1.30.2 Linux 编译静动态库

    默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...

    一文教你如何构建静态链接库.md

    话说ISOC99有自己的一系列标准C函数库,例如我们熟悉的libc.a(包含标准I/O函数、字符串操作函数和整数数学函数)和libm.a(浮点数数学函数),可供我们在使用gcc编译工具编译程序时调用。那么,如果我们在日常学习...

    Linux静态链接库与模板类的处理方式

    在阅读本文之前,小编先给大家介绍一篇相关文章:Linux静态链接库使用类模板的快速排序算法 大家首先看下以上的文章对理解下面的知识点会有很大的帮助。 当模板遇到静态链接库会发生什么呢。 我们先按照常规思路去...

    gcc链接培训第一课

    公司的入门培训,如何使用gcc如何进行编译,交叉编译

    Linux静态库与动态库实例详解

    1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include test.h int main(){ test(); return 0; } // test.h #include using namespace std; void test(); // test.c #include test.h void test...

    wxMSW-3.1.2_gcc510TDMGCC_x64_Dev

    这是用于TDMGCC编译器的wxWidgets开发包,包含需要的静态库、动态库以及编译器相关的头文件。最近这些资源被河蟹了,大家下载起来不容易,所以打算就分享这些文件。使用方法:包含编译器相关头文件、wx头文件、指定_...

    C++链接库的使用,二维向量,三维向量

    1.熟悉各种Linux操作命令;并编写程序,使用GNU gcc/g++进行...3)分别用静态链接和共享链接的方式测试向量的使用。 3.创建包含二维向量和三维向量的向量库:libVector.a和 libVector.so,并分别写出对应的MakeFile文件

    LinkAllSymbols:强制将所有静态库符号链接到 .exe 目标,以在 Windows 上进行完整的代码覆盖测量

    在我们使用 gcc 的 Unix 下,我们可以将标志--whole-archive传递给链接器 ld,这使得 ld 不会丢弃任何对象。 在 Windows Visual Studio 下,没有等效于 GNU ld 的选项 --whole-archive。 链接器选项/ OPT:NOREF也...

    armv7l静态链接aria2客户端aria2c,aria2-1.33.1源码编译,可在armv7l上直接运行

    aria2 version 1.33.1 ...Compiler: gcc 8.3.0 built by x86_64-pc-linux-gnu targeting arm-unknown-linux-gnu Report bugs to https://github.com/aria2/aria2/issues Visit https://aria2.github.io/

    动态库和静态库用法

    预处理 编译 汇编 链接 下面逐个使用 预编译:宏替换 ,文件引入 ,去除空行,注释,为编译做准备 预编译命令: gcc -E test.c -o test.i test.c中内容 #include int main(){ printf(“hello world!\n”); return 0; } -E...

Global site tag (gtag.js) - Google Analytics