Linux下动态库链接问题

Linux下动态库链接问题

今天在编译一个软件做链接时,提示找不到-lgtk-3,安装此库

1.安装libgtk-3库

apt-get install libgtk-3-0
apt-get install libgtk-3-dev

安装完成后查找动态库的安装路径

dpkg -L libgtk-3-0
显示如下
/usr/lib/mips64el-linux-gnuabi64/libgtk-3.so.0
/usr/lib/mips64el-linux-gnuabi64/libgdk-3.so.0

更改/etc/ld.so.conf.d/mips64el-linux-gnu.conf添加动态库的路径

vim /etc/ld.so.conf.d/mips64el-linux-gnu.conf
添加如下内容
/usr/lib/mips64el-linux-gnuabi64/

2.定位分析问题

简单写一个代码进行测试:

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("this is a ld test.\n");
}

编译时提示找不到lgtk-3:

# gcc test.c  -lgtk-3        
/usr/bin/ld: 找不到 -lgtk-3                 
collect2: error: ld returned 1 exit status 

此时就很郁闷了,为什么我明明制定了库的搜索路径还是找不到呢?
经过请教和查找资料才知道 /etc/ld.so.conf.d/下添加的路径是程序运行时的搜索路径

编译时采用如下方式,编译通过:

# gcc test.c -L/usr/lib/mips64el-linux-gnuabi64/ -lgtk-3

那么问题来了,为什么有些动态库并不需要加-L就能链接成功呢?
在编译时,不加-L,添加-v参数

# gcc --help
-v                       Display the programs invoked by the compiler
# gcc test.c  -lgtk-3   -v     

 /usr/lib/gcc/mips64el-linux-gnu/5/collect2 -plugin /usr/lib/gcc/mips64el-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/mips64el-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccqx7A9E.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -EL -mips64r2 -as-needed -dynamic-linker /lib64/ld.so.1 -melf64ltsmip -z relro /usr/lib/gcc/mips64el-linux-gnu/5/../../../mips64el-linux-gnu/crt1.o /usr/lib/gcc/mips64el-linux-gnu/5/../../../mips64el-linux-gnu/crti.o /usr/lib/gcc/mips64el-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/mips64el-linux-gnu/5 -L/usr/lib/gcc/mips64el-linux-gnu/5/../../../mips64el-linux-gnu -L/usr/lib/gcc/mips64el-linux-gnu/5/../../../../lib -L/lib/mips64el-linux-gnu -L/lib/../lib -L/usr/lib/mips64el-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/mips64el-linux-gnu/5/../../.. /tmp/cc2Tudut.o -lgtk3 -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/mips64el-linux-gnu/5/crtend.o /usr/lib/gcc/mips64el-linux-gnu/5/../../../mips64el-linux-gnu/crtn.o
/usr/bin/ld: 找不到 -lgtk-3
collect2: error: ld returned 1 exit status

注意里面-L 库搜路径并没有-L/lib/mips64el-linux-gnuabi64,这到底是怎么回事呢?
接着使用如下命令查看-lgtk-3的查找过程:

# ld -lgtk-3 --verbose
显示如下
==================================================
试图打开 //usr/local/lib/mips64el-linux-gnu/libgtk-3.so 失败
试图打开 //usr/local/lib/mips64el-linux-gnu/libgtk-3.a 失败
试图打开 //lib/mips64el-linux-gnu/libgtk-3.so 失败
试图打开 //lib/mips64el-linux-gnu/libgtk-3.a 失败
试图打开 //usr/lib/mips64el-linux-gnu/libgtk-3.so 失败
试图打开 //usr/lib/mips64el-linux-gnu/libgtk-3.a 失败
试图打开 //usr/local/lib64/libgtk-3.so 失败
试图打开 //usr/local/lib64/libgtk-3.a 失败
试图打开 //lib64/libgtk-3.so 失败
试图打开 //lib64/libgtk-3.a 失败
试图打开 //usr/lib64/libgtk-3.so 失败
试图打开 //usr/lib64/libgtk-3.a 失败
试图打开 //usr/local/lib/libgtk-3.so 失败
试图打开 //usr/local/lib/libgtk-3.a 失败
试图打开 //lib/libgtk-3.so 失败
试图打开 //lib/libgtk-3.a 失败
试图打开 //usr/lib/libgtk-3.so 失败
试图打开 //usr/lib/libgtk-3.a 失败
试图打开 //usr/mips64el-linux-gnu/lib64/libgtk-3.so 失败
试图打开 //usr/mips64el-linux-gnu/lib64/libgtk-3.a 失败
试图打开 //usr/mips64el-linux-gnu/lib/libgtk-3.so 失败
试图打开 //usr/mips64el-linux-gnu/lib/libgtk-3.a 失败
ld: 找不到 -lgtk-3

从上面可以看到,libgtk-3.so的搜索路径确实不包含/usr/mips64el-linux-gnuabi64/

3.解决方法

方法1.在编译加上-L/usr/lib/mips64el-linux-gnuabi64/

方法2.在制作gtk的deb包时,要考虑到库默认搜索路径,将其安装在默认搜索路径下。
本次使用将/usr/lib/mips64el-linux-gnuabi64/下的gtk相关的文件全部拷贝到/usr/lib/mips64el-linux-gnu下。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值