zoukankan      html  css  js  c++  java
  • 【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!

  • 相关阅读:
    09.非线性-指数增长模型
    08.多元线性回归模型
    07.线性回归模型
    06.齐普夫定律验证
    05.森林火灾模型
    04.沙堆模型
    03.优先链接模型
    02.中心极限定理验证
    centos6字符
    dns解析慢 修改的参数
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532356.html
Copyright © 2011-2022 走看看