Linux静态库与动态库实例详解
Linux静态库与动态库实例详解
1.Linux下静态链接库编译与使用
首先编写如下代码:
//main.c #include"test.h" intmain(){ test(); return0; } //test.h #includeusingnamespacestd; voidtest(); //test.c #include"test.h" voidtest(){ cout<<"test!"< 然后编译:
1.gcc-ctest.c//生成目标文件
2.arcrvlibtest.atest.o//生成静态链接库libtest.a
3.g++-omainmain.c-ltest//编译main程序同时链接libtest.a静态库
4../main//运行main程序
2.Linux下动态链接库编译与使用
代码与上述一致。
然后编译:
1.g++-fPIC-shared-olibtest.sotest.c//生成动态链接库libtest.so
2.g++-omainmain.c-ltest//调用动态链接库libtest.so
3../main//运行main程序
3.链接时缺失了相关目标文件(.o)
代码与上述一致。
编译过程如下:
1.gcc-ctest.c
2.gcc-cmain.c
3.gcc-omainmain.o
这时,你会发现,报错了:undefinedreferenceto`test'.
这就是最典型的undefinedreference错误,因为在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。
1.gcc-omainmain.otest.o【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译 也会报undefinedreference错,其实底层原因与上面是一样的。 gcc-omainmain.c//缺少test()的实现文件 需要改成如下形式才能成功,将test()函数的实现文件一起编译。 gcc-omainmain.ctest.c//ok,没问题了4.链接时缺少相关的库文件(.a/.so)
在此,只举个静态库的例子,假设源码与上述一致。 1.把test.c编译成静态库: gcc-ctest.c sr-rctest.atest.o gcc-cmain.c 2.生成可执行程序: gcc-omain-main.o 此时同样出现undefinedreferenceto`test'报错。其根本原因也是找不到test()函数的实现文 件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个 库,链接命令修改为如下形式即可。 1.gcc-omainmain.c./test.a5.多个库文件链接顺序问题
这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论 的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果? 1.gcc-omainmain.ofunc.atest.a 我们会得到如下的编译错误: 1.test.a(test.o):Infunction`test': 2.test.c:(.text+0x13):undefinedreferenceto`func' 3.collect2:ldreturned1exitstatus 因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库 的库一定要放到被依赖库的前面,这样才能真正避免undefinedreference的错误,完成编译链接。如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!