当前位置:网站首页 > 编程语言 > 正文

动态库和静态库的使用(动态库和静态库的使用方法)



转自:http://blog.csdn.net/newchenxf/article/details/

假设libXXX.a用了libpthread.so的函数“pthread_create”,那libXXX.a在链接时,有没有把“pthread_create”函数copy到自己身上,使其完全独立?main.c在链接时,只需要链接libXXX.a,还是连libpthread.so也要链接?!这就是我要讨论的内容!

为了证实问题,我们写个测试程序吧。一个是libXXX.a,一个是main.c。

static_lib_example.h

static_lib_example.c

其实Makefile相当于2句命令。所以你不写Makefile,敲下面2句command也行。

gcc -c static_lib_example.c -o static_lib_example.o

ar rcs libstatic_lib_example.a static_lib_example.o

好了,编译结果如下:

ls

libstatic_lib_example.a Makefile static_lib_example.c static_lib_example.h static_lib_example.o


我们就写一个main.c,它会链接libstatic_lib_example.a,并调用函数testFunc(int x)

编译main.c(只需要一个命令,就不写Makefile啦)

gcc -g -O3 -Wall main.c -o main -I/home/chenxf/static_lib_sample/ -L/home/chenxf/static_lib_sample/ -lstatic_lib_example

上面的命令,表示main程序,只链接静态库libXXX.a。(好吧,就是libstatic_lib_example.a啦,干嘛这么纠结名字!^^)

编译结果

/home/chenxf/static_lib_sample/libstatic_lib_example.a(static_lib_example.o):在函数‘testFunc’中:
static_lib_example.c:(.text+0x86):对‘pthread_create’未定义的引用
static_lib_example.c:(.text+0xd4):对‘pthread_join’未定义的引用
collect2: error: ld returned 1 exit status














出错啦!!!!!!
在main.c链接的时候,说找不到pthread_create了!

看来,静态库libXXX.a并没有把动态库的函数copy到自己身上,只留了符号表,所以main.c要用libXXX.a时,还必须链接动态库libpthread.so。也就是

gcc -g -O3 -Wall main.c -o main -I/home/chenxf/static_lib_sample/ -L/home/chenxf/static_lib_sample/ -static -lstatic_lib_example -lpthread

(libpthread.so在默认的系统库目录/usr/lib,不需要再写-L/usr/lib/)

这样一写,就OK啦!编译就成功了!

我们还可以 nm 工具,来确认libXXX.a到底有木有把pthread_create()函数copy到自己身上。

U表示仅仅调用,而没有定义。也就是该库并不独立,而是依赖于其他库,比如libpthread.so

任何其他程序,想用libXXX.a,链接时都需要链接libXXX.a所依赖的动态库。
至于程序跑起来时,动态库是否要在现场?这个就跟编译程序加不加-static有关系了。
请看我另一博文就知道。gcc-static命令




但是,如果你要写的库,依赖很多其他的库,那你还是改写成动态库吧!否则,作为写其他程序的人,如果要用你的库,那写Makefile时,还得知道你到底依赖了什么动态库,否则编译都编译不过,多痛苦啊!!!

到此这篇动态库和静态库的使用(动态库和静态库的使用方法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • data文件夹访问限制(data文件夹访问限制怎么解除1+)2025-07-25 13:18:04
  • ov内存卡和朗科哪个(朗科和夏科内存卡)2025-07-25 13:18:04
  • polowalk是什么品牌中文意思(polo什么意思中文意思)2025-07-25 13:18:04
  • 复合vb1的功效与作用(复合vb有什么作用)2025-07-25 13:18:04
  • ubuntu源(Ubuntu源码下载)2025-07-25 13:18:04
  • 文件比较器安卓(文件比较器安卓怎么用)2025-07-25 13:18:04
  • ubuntu源码编译安装(ubuntu编译安卓源码)2025-07-25 13:18:04
  • 程序制作(希沃抽奖小程序制作)2025-07-25 13:18:04
  • 发送验证码的短信收费吗(发送短信验证码需要钱吗)2025-07-25 13:18:04
  • yolov3作者(yolov5作者)2025-07-25 13:18:04
  • 全屏图片