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方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步:
链接共享库与链接静态库最大的不同之处在于:并不是将被调用代码指令复制到调用模块中,而是将被调用代码指令在共享库中的相对地址复制到调用模块中,体现在最终的可执行文件中。
共享库特性如下:
优点:
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方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步:
相关文章推荐
- linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试2
- linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试1
- UNIX环境高级编程学习之第十五章进程间通信 - 系统V 共享内存使用(使用信号灯保护共享内存)
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
- unix环境高级编程-3.10-文件共享
- iPhone & iPad高级编程(35年编程经验结晶之作,案例源码免费下载)
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
- linux高级编程基础系列:System V进程间通信(信号量、共享内存)
- Linux高级编程之共享内存
- Unix环境高级编程:文件 IO 原子性 与 状态 共享
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- 高级并发编程之 线程范围内安全共享数据(使用Map方式)
- UNIX环境高级编程学习之第十五章进程间通信 - 两个进程通过映射普通文件实现共享内存通信
- nginx整合tomcat集群并做session共享----测试案例
- UNIX 环境高级编程(二)—— linux共享库,/etc/ld.so.conf 及 ld.so.conf.d/libc.conf
- 【linux高级环境编程学习笔记三】共享内存通信
- Linux共享库的动态加载(附测试案例)
- nginx整合tomcat集群并做session共享----测试案例
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)