时间:2021-05-19
Linux静态库与动态库实例详解
1. Linux 下静态链接库编译与使用
首先编写如下代码:
// 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()函数的实现,所以如果按下面这种方式链接就没事了。
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的错误,完成编译链接。如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
静态库与动态库的创建与使用1.基本概念静态库:链接时,库与编译生成的.o文件一起打包到可执行文件中。linux/windows下扩展名分别为:.a/.lib动态
IOS静态库和Framework区别一、什么是库?库是共享程序代码的方式,一般分为静态库和动态库。二、静态库与动态库的区别?静态库:链接时完整地拷贝至可执行文件
Linux动态库函数的详解加载动态库void*dlopen(constchar*filename,intflag);flag的可能值:RTLD_LAZYRTLD
C++中动态链接库--导入和导出的实例详解__declspec(dllexport)和__declspec(dllimport):__declspec(dlle
详解dll动态库的开发与调用及文件的读写小程序首先我们先来学习一下动态库的调用,先找到动态库的.dll和.lib文件并将其导入到同源文件相同级别的文件夹下面,然