linux依赖包技巧,Linux下寻找静态库依赖的一个小技巧

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

最近实习需要用到编译一些静态库, 但是静态库编译相互依赖的库也是非常让人头大了, 这里我介绍一个还不错的小办法来解决这个问题.

首先, 用动态库编译.一般来说, 用动态库编译都比较简单, 实际上在动态库和静态库都存在的情况下, g++也是默认会先链接到动态库的, 所以我们正常编译得到一个可执行文件(或者动态库也行), 然后我们用ldd这个工具看一下这个库所依赖的动态库, 注意这个时候我们只需要找到那些动态库所在的路径就好, 假设是PATH吧.

然后, 我们开始使用静态库编译.这里还有几种链接静态库的方式, 参见我之前的博客, gcc链接静态库的几种方式, 这个时候我们一般会看到很多错误,当然你要是没有错误,那就恭喜了哈哈, 一般我们会遇到一些undefined reference to xxxx. 这个xxxx一般是一个函数名, 其实就是在链接的过程中没有找到这个函数的定义, 因为这个函数的定义可能在另外一个静态库里面, 而我们没有去链接到这个静态库, 这里我就要展示我的小技巧了, 我的小技巧是一个脚本.

使用脚本找到到底是哪个静态口包含了xxxx这个函数的定义先展示一下脚本的代码,其实也不复杂, 用到了nm这个工具1

2

3

4

5

6

7

8

9

10

11

12

13

14

15#!/bin/bash

if [ $# -lt 1 ]

then

echo "USAGE: $0 function_name"

exit 1

fi

for name in $(ls *.a)

do

res=$(nm -g --defined-only ${name} | grep $1)

if [ -n "$res" ]

then

echo ${name}

echo ${res}

fi

done

值得注意的是我们需要把这个脚本放到我们之前找到的PATH下面, 这个PATH一般都是一些系统文件存放的地方, 所以我们需要使用sudo命令来将脚本放进去, 再用sudo权限运行, 一般这个时候我们就能找到到底是哪个静态库包含xxxx这个函数的定义了, 我们只需要将这个静态库添加到我们编译时指定的包含路径就好, 需要注意的是可能需要加上-l选项, 比如静态库的名称是libpng.a, 我们就要在编译的时候加上-lpng选项, 否则编译器还是报undefined reference to xxxx哦.

写到这里就差不多结束了, 这里我们介绍的基本是专门针对要链接静态库的情况, 实际上我们平时可能也不太需要这样做, 这里我只是简单记录一下, 如果不用移植的话, 用动态库就更方便多了, 如果用动态库链接也失败的话, 基本就是编译少了选项, 或者动态库没找到了, 一般也用不到我这个办法(笑), 不过这里记录一下, 兴许以后自己还能用得着, 同时也熟悉了Linux下shell脚本的编写.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值