共享库本质就是由若干个.o文件打包生成的.so文件。
链接共享库与链接静态库最大的不同之处在于:并不是将被调用代码指令复制到调用模块中,而是将被调用代码指令在共享库中的相对地址复制到调用模块中,体现在最终的可执行文件中。
共享库特性如下:
优点:
1)生成的可执行文件比较小,占用存储空间比较小;
2)修改和维护都比较方便,因为一旦代码有所改动,只要相对地址不变,则直接对可执行文件生效;
缺点:
1)需要跳转,因为执行效率比较低;
2)不能脱离共享库而独立运行可执行文件;
共享库的生成和调用步骤,如下:
(1)共享库的生成步骤:
a.编写源代码文件xxx.c,如:vi add.c
b.只编译不链接生成目标文件xxx.o,如:
cc -c -fpic/小模式 建议选项/ add.c
c.生成共享库文件
cc -shared 目标文件 -o lib库名.so
cc -shared add.o -o libadd.so
(2)共享库的调用步骤:
a.编写调用的源代码文件xxx.c,如: vi main.c
b.只编译不链接生成目标文件xxx.o,如:cc -c main.c
c.链接共享库文件,链接的方式有以下三种:
1)直接链接
cc 目标文件 共享库文件
cc main.o libadd.so
2)采用编译选项进行链接
cc 目标文件 -l 库名 -L 库文件的路径
cc main.o -l add -L .
3)配置环境变量方式进行链接
export LIBRARY_PATH=
cc main.o -l add
注意:
1)为了解决可执行文件运行时找不到共享库的问题,则需要配置环境变量LD_LIBRARY_PATH,具体的配置方法如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:共享库路径
2)当静态库和共享库同时存在并且库名相同时,使用第二个链接方法则会优先链接共享库,如果希望链接静态库,则需要使用-static选项来强制要求;
测试实例:
1、编写各部分的代码文件:
2、生成共享库
3、调试共享库
以下是我的个人公众号,主要作为C/C++语言技术分享使用,该公众号里干货满满,如果您有对此博文的疑问或者java方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步: