【linux/debug】程序员的自我修养——链接的理解

Date: 2018.9.26


1、参考

https://www.cnblogs.com/nufangrensheng/p/3578784.html
https://blog.csdn.net/sevenjoin/article/details/78041377
https://blog.csdn.net/aguei868/article/details/52624065
https://www.cnblogs.com/flyinggod/p/8026567.html

signal 9:
https://blog.csdn.net/vickyjfr/article/details/46238833

2、链接的理解

   今天遇到一个很奇怪的bug:
   在采用demo链接一个静态库时,生成的demo可执行文件并没有包含静态库中的函数;然而采用demo单独链接静态库中的每一个目标文件时,能够包含静态库中的函数。 最后通过分析才弄清楚,静态库虽然包含进了我们需要的优化函数,但是控制进入优化分支的特定宏并没有开启,导致demo在链接静态库时,不包含特定的函数。

3、静态库、动态库编译链接的方法

静态库实质上是目标文件的集合,通过ar程序将目标文件打包成静态库。可执行文件链接静态库时是将静态库中内容完全包入可执行文件中,通常文件比较大。

动态库是在运行时加载的,采用gcc -shared链接成动态库。可执行文件链接动态库只是将函数符号的映射包入可执行文件中,通常文件比较小。

详细分析可以参考:https://www.cnblogs.com/nufangrensheng/p/3578784.html

静态库链接的几种方法:
1、以-L,-l指定库时,gcc会在对应的路径搜索有lib前缀的库,所以生成的库必须是libxx.a这样的格式,比如:

CFLAGS += -LlibaryPath, -l_svac2_dec

2、如果要链接没有lib前缀的库文件,可以直接指定库的全名,无需加-L,-l选项。

另外,当编译可执行文件需要链接多个静态库的情况:
1)、静态库是前后依赖关系,则依赖库靠前,被依赖的库靠后,如a依赖b,-la -lb
2)、静态库是相互依赖关系,则需要多次添加同一个库,如a依赖b,同时b依赖a,-la -lb -la
3)、有没有比较优雅的方式解决第2种情况,有,加链接的属性,如:-Xlinker --start-group -la -lb -Xlinker --end-group

动态库链接的方法:
在编译程序时,使用动态链接库和静态链接库是一致的,使用"-lxxx"的方式:

CFLAGS += -LlibaryPath, -l_svac2_dec

比较重要的一点:
  如果系统的搜索路径下同时存在静态链接库和动态链接库,默认情况下会链接动态链接库。如果需要强制链接静态链接库,需要加上"-satic"选项。


THE END!

原文地址:https://www.cnblogs.com/SoaringLee/p/10532356.html