天天看点

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

关注、星标公众号,直达精彩内容

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

ID:嵌入式情报局

作者:情报小哥

1查看执行文件共享库

    在平时的开发中可能会存在这样的需求,想确定所提供的可执行文件需要哪些动态共享库,这样方便我们进行相关路径的设置和准备,防止在编译过程中造成的编译错误。

    这样Linux提供了ldd命令,通过使用该命令行不仅仅能够知道该可执行文件需要哪些动态共享库文件,同时还能够测试这些共享库是否能够被加载。

    下面小哥就使用ldd命令查看之前的Test可执行文件的链接状态,大家可以发现在连接过程中不仅仅只包括我们自己编写的libTest.so共享库文件,还包括libc其他动态库文件。

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)
bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

ldd命令

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

    ldd不是一个可执行文件,仅仅只是一个shell脚本,通过该脚本设置相应的环境变量的值,从而使得ld-linux.so(elf动态库的装载器)只显示该执行程序的依赖。

    ldd命令还有一些可选的选项,下面小哥简单的例举了几个,其他的可以通过man命令来查找:

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

2指定链接动态或者静态库

    前面的知识中不管是动态链接库还是静态链接库都会把最终的库文件定义为libxxx.so或者libxxx.a,这样方便GCC进行链接查找并进行相应的程序链接。

    然而如果其中的xxx名字是一样的,GCC该进行如何的链接呢?下面小哥就前面的例子实验一下:

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

     把两个链接库名字中的xxx都改成了Test,然后执行可执行文件的生成,最终使用ldd命令发现其进行的还是动态链接方式,所以gcc默认是采用的动态链接,如果找不到对应的动态链接就会采用静态链接方式。

    那么小哥再介绍一下gcc的 -static选项,通过使用该选项,最终编译器会以静态链接的方式进行库的链接,如下:

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

    通过使用-static选项,最终生成的可执行文件大小相比动态链接库不是一个数量等级上的。

    从上面的结果也可知道该选项使用的是完全的静态链接方式,如果使用ldd会提示其没有任何依赖的共享库:

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

    然而在平时的开发中还会有动静态混合链接的需求,这样就需要使用到GCC的-Wl,-Bstatic ,-Wl,-Bdynamic等选项,本文就暂时不展开了,后面的文章小哥再跟大家演示。

3小结

    今天主要是跟大家介绍了ldd命令和-static完全的静态链接,同时在平时的开发中还会有动静态混合链接的需求,下期精彩见。

bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)
bazel 链接第三方动态库_Linux应用编程之动静态链接库辅助技巧(ldd,static)

长按前往图中包含的公众号关注

继续阅读