Linux静态库与动态库实例详解

  

<强> Linux静态库与动态库实例详解

  

1。Linux下静态链接库编译与使用

  

首先编写如下代码:

     //c   # include“test.h”   int main () {   测试();   返回0;   }//test.h   # include   使用名称空间性病;   空白测试();//test.c   # include“test.h”   空白测试(){   cout<& lt;“测试!”& lt; & lt; endl;   }      之前      

然后编译:
  

  

1。gcc - c测试。c//生成目标文件
  2. 基于“增大化现实”技术的crv libtest。一个测试。//阿生成静态链接库libtest。一个
  3.g++ - o主要主要。c -ltest//编译主程序同时链接libtest。一个静态库
  4 .主要。///运行主程序
  

  

2。Linux下动态链接库编译与使用

  

代码与上述一致。

  

然后编译:
  

  

1。g++ - fpic - shared - o libtest。所以测试。c//生成动态链接库libtest。所以
  2. g++ - o主要主要。c -ltest//调用动态链接库libtest。所以
  3 .主要。///运行主程序
  

  

3。链接时缺失了相关目标文件(. o)

  

代码与上述一致。

  

编译过程如下:
  

  

1。gcc - c测试。c
  2. gcc - c主要。c
  3.gcc - o主要主要。o
  

  

这时,你会发现,报错了:未定义的引用‘测试’。

  

这就是最典型的定义参考错误,因为在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了测试()函数的实现,所以如果按下面这种方式链接就没事了。
  

        1. gcc - o主要主要。o test.o         之前            【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译   也会错报未定义的引用,其实底层原因与上面是一样的。      gcc - o主要主要。c//缺少测试()的实现文件      需要改成如下形式才能成功,将测试()函数的实现文件一起编译。      gcc - o主要主要。c测试。c//好吧,没问题了      之前      

4。链接时缺少相关的库文件(。/. so)

        在此,只举个静态库的例子,假设源码与上述一致。      1. 把test.c编译成静态库:   gcc - c test.c   sr rc测试。一个test.o   gcc - c c      2. 生成可执行程序:   gcc - o主要-main.o      此时同样出现未定义引用“测试”报的错。其根本原因也是找不到测试()函数的实现文   件,由于该测试()函数的实现在试验原理这个静态库中的,故在链接的时候需要在其后加入试验原理这个   库,链接命令修改为如下形式即可。   1. gcc - o主要主要。c。/试验原理      之前      

5。多个库文件链接顺序问题

        这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论   的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果吗?      1. gcc - o主要主要。o函数。一个试验原理      我们会得到如下的编译错误:      1. 试验原理(test.o):在功能的测试:   2. test.c:(。text + 0 * 13):未定义的引用“函数”   3.collect2: ld返回1退出状态   因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库   的库一定要放到被依赖库的前面,这样才能真正避免未定义的引用的错误,完成编译链接。      之前      

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Linux静态库与动态库实例详解