您的位置:首页 > 运维架构 > Linux

Linux C语言高级编程之共享库(附测试案例)

2017-11-21 09:40 162 查看
共享库本质就是由若干个.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=LIBRARYPATH:新路径cc目标文件−l库名exportLIBRARYPATH=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方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 linux 共享库
相关文章推荐