Linux静态库与动态库实例详解
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Linux静态库与动态库实例详解1. Linux 下静态链接库编译与使用首先编写如下代码:// main.c#include "test.h"int main(){ test(); return
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
精品咖啡豆
深圳九邦互联网科技有限公司
科技金融是不是互联网金融
科技类互联网
沃里互联网科技
互联网科技有限公司 翻译
居家互联网科技有限公司
互联网对科技的发展
湖北码尼互联网科技有限公司电话
互联网科技公司有风险吗
互联网科技与大数据专业
成都互联网科技公司工作好不好
民营互联网公司国防科技
互联网科技包装股
全球科技与互联网公司市值变化
科技和互联网行业的特点
马化腾互联网科技教学
广西泛欧互联网科技有限公司
互联网的科技体现在哪里
前海云享互联网科技
沃里互联网科技
美国互联网前沿科技
太原新华互联网科技学校怎么样
成都铂石互联网科技做什么的
世界互联网科技公司市值排名
岳阳华臻互联网科技有限公司
和信科技工业互联网
青岛易易互联网科技
上海旺乐尼互联网科技有限公司
互联网高科技绘画