翻译:usr/bin/ld: cannot find -l

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),相同的过程也可以使用,尽管细节不一致。

你可能感兴趣的:(翻译:usr/bin/ld: cannot find -l)