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

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

63643c3836eb4c2459c77fa2c3f45fbb.png

ID:嵌入式情报局

作者:情报小哥

1查看执行文件共享库

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

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

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

fee8585239f15d1a015fca9701f548a7.png

55c6360c9782214e6663a3e3f1207999.png ldd命令 540e741ef60f9de993ccaea1988cbafc.png

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

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

d1543e810ce8a0ff36a8fea80fdce084.png

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

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

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

d8202d5ec36e9b2a1c06d2a7514d6981.png

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

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

ba5cc61e0a582ae456d0f0fb70b7bb41.png

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

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

fe6edb2bd0999b106183f03a99c4a315.png

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

3小结

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

ad78441e8bcecf809ccef05444f38590.gif

276069dee746520091dfac96bb249417.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值