Linux静态库与动态库实例详解
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,Linux静态库与动态库实例详解1. Linux 下静态链接库编译与使用首先编写如下代码:// main.c#include "test.h"int main(){ test(); return
千家信息网最后更新 2025年12月01日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.a
5. 多个库文件链接顺序问题
这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第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安全错误
数据库的锁怎样保障安全
软件开发待遇高吗
公司数据库设计由谁来做
公安网络安全助手下载不了
微信小程序数据库定义
wps软件开发商
河南软件开发公司排名
neo4j数据库的技术
服务器的配置与管理书
网络技术英语文章
江苏小型软件开发
网络安全最基础工作
道琼斯数据库怎么搜索
微小企业如何选择云服务器
川大网络安全博士毕业要求
小米登录账号提示 服务器错误
微信公众号服务器验证
湖北智慧城管软件开发系统
vmware导入数据库
人民银行网络安全十不准
独云科技软件开发有限公司
iv级及以上网络安全事件
明日之后新手学哪个服务器好
数据库的力量图片
天足网络安全比赛
seer数据库怎么找肿瘤病史
小米互联网科技有限公司
数据库字段加密破解
初识数据库管理系统教案
网络安全是关键吗
普通人怎么使用数据库