Linux C语言高级编程之共享库(附测试案例)
来源:互联网 发布:什么软件制作数据图表 编辑:程序博客网 时间:2024/05/18 03:57
共享库本质就是由若干个.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方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步:
- Linux C语言高级编程之共享库(附测试案例)
- Linux共享库的动态加载(附测试案例)
- Linux下C语言高级编程必备!(附多文件编程代码)
- Linux下C语言高级编程之gcc高级用法?
- C语言基础之字符串(附测试代码)
- linux网络编程之:接受网络中的ARP数据并分析(附C语言实现)
- Linux高级编程之共享内存
- linux下c语言多线程编程案例
- C语言高级编程 之 指针
- linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试2
- linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试1
- linux网络编程之:获取指定网卡网络数据包并分析(附C语言源码)
- C语言高级测试(一)
- C语言高级测试(二)---答案
- (十四)C语言高级编程
- linux下C语言编程7-信号量与共享内存
- 嵌入式C语言高级编程技巧 之 温故知新的指针
- Linux C高级编程——网络编程之API(5)
- JAVA内存模型(学习记录)
- AndroidStudio如何引入so包和更换默认目录
- 20-EMM Procedure 8&9. Handover & Cell Reselection with TAU
- SpringBoot+JPA(Hibernate)事物手动控制
- CADisplayLink
- Linux C语言高级编程之共享库(附测试案例)
- 制造业未来有多「智能」,12月长沙见分晓
- 多线程基础学习十:java.util.lock.concurrent.locks中lock
- Please select Android SDK
- Ubuntu 16.04切换/home中文目录为英文目录
- 1058. 选择题(20)
- Firefox全历史版本下载
- 输出字符长度_问题
- 重要网站梳理