1. Linux 下静态链接库编译与使用
首先编写如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
// main.c
#include "test.h"
int main(){
test ();
return 0;
}
// test .h
#include<iostream>
using namespace std;
void test ();
// test .c
#include "test.h"
void test (){
cout<< "test!" <<endl;
} |
然后编译:
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 |
1. gcc -o main main.o test .o |
1
2
3
4
5
6
7
8 |
【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译
也会报undefined reference错,其实底层原因与上面是一样的。
gcc -o main main.c // 缺少 test ()的实现文件
需要改成如下形式才能成功,将 test ()函数的实现文件一起编译。
gcc -o main main.c test .c //ok ,没问题了 |
4. 链接时缺少相关的库文件(.a/.so)
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
在此,只举个静态库的例子,假设源码与上述一致。
1. 把 test .c编译成静态库:
gcc -c test .c
sr -rc test .a test .o
gcc -c main.c
2. 生成可执行程序:
gcc -o main -main.o
此时同样出现 undefined reference to ` test '报错。其根本原因也是找不到 test ()函数的实现文
件,由于该 test ()函数的实现在 test .a这个静态库中的,故在链接的时候需要在其后加入 test .a这个
库,链接命令修改为如下形式即可。
1. gcc -o main main.c . /test .a |
5. 多个库文件链接顺序问题
1
2
3
4
5
6
7
8
9
10
11
12 |
这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第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的错误,完成编译链接。 |
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/u013709270/article/details/53264141
相关文章
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 21
-
2025-05-25 26
-
2025-05-27 100
-
2025-06-04 100
-
2025-05-29 100