g++编译后运行时无法链接动态库的解决方法

问题发现:

$
g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include
-L/usr/local/lib -lmicrohttpd -ldl

$
./hellobrowser.exec

error
while loading shared libraries: libmicrohttpd.so.10: cannot open
shared object file: No such file or directory

$
whereis libmicrohttpd

发现/usr/local/lib下有这个库

$
cd /usr/local/lib

$
find libmicrohttpd.so.10

的确有这个文件。

这是因为动态库默认只会在/usr/lib下找。不会去/usr/local/lib找。


解决方法:

法1:sudo
vi /etc/ld.so.conf

添加一行:

/usr/local/lib

然后sudo
ldconfig使得生效。这样动态库就会去/usr/local/lib找了。

 

法2:

g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include -L/usr/local/lib -lmicrohttpd -ldl -Wl,-R /usr/local/lib

 

法3:
$ ln -s /usr/local/lib/libmicrohttpd.so.10 /usr/lib/libmicrohttpd.so.10
# ln -s /usr/local/lib/libmicrohttpd.so /usr/lib/libmicrohttpd.so


推荐法1和法2.


 

分析解释:

 

默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件。

虽然g++
-L/usr/local/lib虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这个库路径加上-Wl,-R,即添加g++参数“-Wl,-R
动态库库路径”。


或者修改系统文件/etc/ld.so.conf,这个文件记录了编译时使用的动态链接库的路径。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值