Stack overflow地址:c++ - usr/bin/ld: cannot find -l - Stack Overflow
翻译:
我尝试编译我的程序但是它返回了这个错误:use/bin/ld: cannot find -l在我的Makefile文件中,我使用了g++并且链接了我的库,这个库是位于其他目录中的库的符号链接
有其他选项需要添加来使make成功吗?
1Answer:
如果你得库的名字叫做libxyz.so,并且它位于:/home/user/myDir
需要在你的程序中链接:g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
2Answer:
为了找出链接器在寻找什么,以详细信息模式运行它
举个例子,我遇到过这么一个问题,当我尝试编译MySQL支持ZLIB的时候。我遇见了这么一个错误在编译期间:
/usr/bin/ld:cannot find -lzlib
我做了一些google搜索并遇到了不同的问题,那些人们确保没事的。实际上文件存在,如果不存在的话,就是创建一个符号链接指向版本文件,
举个例子,zlib.so.1.2.8,但是在我检查的时候,zlib.so确实存在,我想这绝对不是问题的原因。
我在网上看到另一篇文章,建议运行make带有LD_DEBUG=all,如:
LD_DEBUG=all make
尽管我得到了大量的调试输出,这没有任何实际用途。它加剧了我的困惑。因此,我快要放弃了。
然后,我恍然大悟。我想要检查一下ld命令的help文档。
ld --help
由此,我想到了运行ld用详细模式(想象一下)
ld -lzlib --verbose
下面是我得到的输出:
==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib
Ding,ding,ding...
所以,最终解决了它我可以编译MySQL用我自己的ZLIB版本(而不是捆绑的版本):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
是吧。
3Answer:
在使用g++编译期间,修改Makefile中的-L选项可能是不正确的。可以通过修改LIBRARY_PATH的定义进行编译。我把我额外的库放在了/opt/lib中,所以我这么做了:
$export LIBRARY_PATH=/opt/lib
然后make成功编译并且链接。
运行程序带着共享库的定义:
$export LD_LIBRARY_PATH=/opt/lib
在执行程序之前。
4Answer:
几乎没有任何答案可以定位一个非常初学者的问题,因为一开始没有安装所需要的库。
在Debinanish平台,如果libfoo丢失,你可以频繁的安装它像下面这样:
apt-get install libfoo-dev
-dev版本的包是开发者所需要的,即是很简单的开发工作编译源码也需要连接这个库。
这个包的名字有时候需要带一些装饰(libfoo0-dev? foo-dev不带lib前缀,等等),或者你可以简单的使用发行版本包准确的搜索那个包被详细的提供。
(如果这里多于一个包,你可能需要找出他们之间的区别。找出最酷或者最流行的是一个常见的捷径,但不是可接受的对于任何严肃的开发者来说。)
对于其他架构(尤其是RPM),相同的过程也可以使用,尽管细节不一致。