我试图编译我的程序,它返回这个错误:

usr/bin/ld: cannot find -l<nameOfTheLibrary>

在我的makefile中,我使用命令g++并链接到我的库,这是一个符号链接到我的库位于另一个目录。

是否有一个选项添加,使其工作,请?


当前回答

检查你的库的位置,例如lxxx.so:

locate lxxx.so

如果不在/usr/lib文件夹中,输入:

sudo cp yourpath/lxxx.so /usr/lib

完成了。

其他回答

这是我笔记本电脑的Ubuntu信息。

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

我使用locate查找boost_filesystem和boost_system的.so文件

locate libboost_filesystem
locate libboost_system

然后将.so文件链接到/usr/lib并重命名为.so

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so

完成了!R包velocyto。R安装成功!

除了已经给出的答案,也可能是*。因此文件存在,但没有正确命名。也可能是*。所以文件存在,但它由另一个用户/ root拥有。

问题1:名称不当

如果您将文件链接为-l<nameOfLibrary> 那么库文件名必须是lib<nameOfLibrary>的形式 如果你只有<nameOfLibrary>。重命名文件!

问题2:错误的所有者

为了验证这不是问题-做

ls -l /path/to/.so/file

如果文件由root或其他用户拥有,则需要执行

sudo chown yourUserName:yourUserName /path/to/.so/file

要找出链接器正在寻找什么,请在verbose模式下运行它。

例如,我在尝试用ZLIB支持编译MySQL时遇到了这个问题。在编译过程中,我收到了这样一个错误:

/usr/bin/ld: cannot find -lzlib

我做了一些谷歌搜索,不断遇到不同的同类问题,人们会说,要确保.so文件确实存在,如果它不存在,那么就创建一个到版本文件的符号链接,例如,zlib.so.1.2.8。但是,当我检查时,zlib。确实存在。所以,我想,这肯定不是问题所在。

我在网上看到了另一篇文章,建议使用LD_DEBUG=all运行make:

LD_DEBUG=all make

虽然我得到了大量的调试输出,但实际上并没有什么帮助。这比其他任何事情都更让人困惑。所以,我打算放弃了。

然后,我有了一个顿悟。我想实际检查一下ld命令的帮助文本:

ld --help

由此,我想出了如何在verbose模式下运行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

叮,叮,叮...

所以,为了最终解决这个问题,我可以用我自己的ZLIB版本(而不是捆绑版本)编译MySQL:

sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

拖鞋!

如果你的库名是libxyz。因此,它位于路径上,说:

/home/user/myDir

然后将其链接到您的程序:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog

检查你的库的位置,例如lxxx.so:

locate lxxx.so

如果不在/usr/lib文件夹中,输入:

sudo cp yourpath/lxxx.so /usr/lib

完成了。