我试图编译我的程序,它返回这个错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的makefile中,我使用命令g++并链接到我的库,这是一个符号链接到我的库位于另一个目录。
是否有一个选项添加,使其工作,请?
我试图编译我的程序,它返回这个错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的makefile中,我使用命令g++并链接到我的库,这是一个符号链接到我的库位于另一个目录。
是否有一个选项添加,使其工作,请?
当前回答
首先,你需要知道lxxx的命名规则:
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst
Lc就是libc。LLTDL的意思是libltdl。所以,lXtst意味着libx .so。
它是lib + lib-name +。So
一旦我们知道了这个名称,我们就可以使用locate来找到这个lxxx的路径。所以文件。
$ locate libiconv.so
/home/user/anaconda3/lib/libiconv.so # <-- right here
/home/user/anaconda3/lib/libiconv.so.2
/home/user/anaconda3/lib/libiconv.so.2.5.1
/home/user/anaconda3/lib/preloadable_libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/preloadable_libiconv.so
如果你找不到它,你需要通过yum安装它(我使用CentOS)。通常你有这个文件,但它没有链接到正确的地方。
将它链接到正确的位置,通常是/lib64或/usr/lib64
$ sudo ln -s /home/user/anaconda3/lib/ libiccon .所以/usr/lib64/
完成了!
裁判:https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
其他回答
我遇到了同样的错误消息。
我构建了cmocka作为一个so,并试图将它链接到我的可执行文件。 但ld总是抱怨如下:
/usr/bin/ld:无法找到-lcmocka
在构建cmocka之后,生成了3个文件:
libcmocka.so libcmocka.so.0 Libcmocka. So. 0.7.0
1和2是符号链接,只有3是真正的文件。
我只复制了1到我的库文件夹,ld没有找到3。
在我复制了所有的3,ld作品。
我在使用Centos 7.8的新VM上编译LXC时遇到了这个问题。我尝试了以上所有的方法,但都失败了。有人建议从编译器配置中删除-static标志,但我不想改变任何东西。
唯一有帮助的是安装glibc-static并重试。希望这能帮助到别人。
编译时
当g++说不能找到-l< nameoftheelibrary >时,这意味着g++查找的文件是lib{nameoftheelibrary}。但它无法在共享库搜索路径中找到它,而共享库搜索路径默认指向/usr/lib和/usr/local/lib或者其他地方。
要解决这个问题,您应该在这些搜索路径中提供库文件(lib{nameoftheelibrary}.so),或者使用-L命令选项。-L{path}告诉g++(实际上是ld)在默认路径之外查找路径{path}中的库文件。
示例:假设在/home/taylor/libswift. .有一个库你想把你的应用链接到这个库。在这种情况下,你应该为g++提供以下选项:
g++ main.cpp -o main -L/home/taylor -lswift
注意1:-l选项在开始和结束时获取库名,不包含lib和.so。 注意2:在某些情况下,库文件名后面跟着它的版本,例如libswift.so.1.2。在这些情况下,g++也无法找到库文件。解决这个问题的一个简单方法是创建一个到libswift.so.1.2的符号链接,称为libswift.so。
运行时
当你将你的应用链接到一个共享库时,库必须在你运行应用时保持可用。在运行时,你的应用(实际上是动态链接器)在LD_LIBRARY_PATH中寻找它的库。它是一个存储路径列表的环境变量。
示例:在我们的libswift。例如,动态链接器找不到libswift。因此在LD_LIBRARY_PATH(指向默认搜索路径)中。要解决这个问题,您应该将该变量附加到路径libswift。现在也是这样。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
我试图链接到的库有一个非标准的名称(即没有'lib'前缀),所以他们建议使用这样的命令来编译它-
包含lib/cspice。一个- lm
除了已经给出的答案,也可能是*。因此文件存在,但没有正确命名。也可能是*。所以文件存在,但它由另一个用户/ root拥有。
问题1:名称不当
如果您将文件链接为-l<nameOfLibrary> 那么库文件名必须是lib<nameOfLibrary>的形式 如果你只有<nameOfLibrary>。重命名文件!
问题2:错误的所有者
为了验证这不是问题-做
ls -l /path/to/.so/file
如果文件由root或其他用户拥有,则需要执行
sudo chown yourUserName:yourUserName /path/to/.so/file