(原)g++编译后运行时无法链接动态库的解决方法
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,这个文件记录了编译时使用的动态链接库的路径。
补充@20170417:
如果我要指定链接一个具体路径下的库,可以这样(就不要-l了):
g++ <其它的编译参数,源文件,略> libx.so