Linux静态库与动态库实例详解
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,Linux静态库与动态库实例详解1. Linux 下静态链接库编译与使用首先编写如下代码:// main.c#include "test.h"int main(){ test(); return
千家信息网最后更新 2025年01月31日Linux静态库与动态库实例详解
Linux静态库与动态库实例详解
1. Linux 下静态链接库编译与使用
首先编写如下代码:
// main.c#include "test.h"int main(){ test(); return 0; }// test.h#includeusing namespace std;void test();// test.c#include "test.h"void test(){ cout<< "test!" < 然后编译:
1. gcc -c test.c //生成目标文件
2. ar crv libtest.a test.o //生成静态链接库libtest.a
3. g++ -o main main.c -ltest //编译main程序同时链接libtest.a静态库
4. ./main //运行main程序2. Linux 下动态链接库编译与使用
代码与上述一致。
然后编译:
1. g++ -fPIC -shared -o libtest.so test.c //生成动态链接库libtest.so
2. g++ -o main main.c -ltest //调用动态链接库libtest.so
3. ./main //运行main程序3. 链接时缺失了相关目标文件(.o)
代码与上述一致。
编译过程如下:
1. gcc -c test.c
2. gcc -c main.c
3. gcc -o main main.o这时,你会发现,报错了:undefined reference to `test'.
这就是最典型的 undefined reference 错误,因为在链接时发现找不到某个函数的实现文件, 本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。
1. gcc -o main main.o test.o【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。gcc -o main main.c //缺少test()的实现文件 需要改成如下形式才能成功,将test()函数的实现文件一起编译。gcc -o main main.c test.c //ok,没问题了4. 链接时缺少相关的库文件(.a/.so)
在此,只举个静态库的例子,假设源码与上述一致。1. 把test.c编译成静态库: gcc -c test.c sr -rc test.a test.o gcc -c main.c2. 生成可执行程序: gcc -o main -main.o 此时同样出现 undefined reference to `test'报错。其根本原因也是找不到test()函数的实现文 件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个 库,链接命令修改为如下形式即可。 1. gcc -o main main.c ./test.a5. 多个库文件链接顺序问题
这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?1. gcc -o main main.o func.a test.a我们会得到如下的编译错误:1. test.a(test.o): In function `test': 2. test.c:(.text+0x13): undefined reference to `func' 3. collect2: ld returned 1 exit status 因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
链接
编译
静态
文件
函数
动态
程序
问题
生成
一致
代码
原因
错误
顺序
命令
库文件
底层
形式
目标
运行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
tcl科技属于 互联网
福星科技社区互联网公司
网络安全法立法目的是
网络安全周 领导致辞
Python数据库导入数据
朝阳区网络安全培训
服务器不使用ssh登录
学生呼吁网络安全知识宣传
服务器资源管理 软件
我的世界服务器生存模组
计算机网络技术知道答案
类似sqlite的数据库
软件开发为啥学不懂
台湾省视频会议服务器
安卓系统软件开发怎么收费
深圳长乐网络技术有限公司
企业服务器都放在哪里
网络安全投标标书范本
西藏网络安全简报
坦克争锋服务器维护
制作关于网络安全方面的卡片
网络安全顺口溜30字
华为杯网络技术大赛项目总结
科技互联网推广如何做
数据库实体在哪一层
学校网络安全和宣传工作总结
hp ux管理服务器在
河南安卓软件开发服务费
网络安全检查意见书 深圳市
泾县微型软件开发服务代理品牌