我正在尝试编译我的程序,它返回此错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的makefile中,我使用命令g++并链接到我的库,这是指向位于其他目录中的库的符号链接.
是否可以选择添加以使其正常工作?
dca*_*ith 424
要确定链接器要查找的内容,请以详细模式运行它.
例如,我在尝试使用ZLIB支持编译MySQL时遇到了这个问题.我在编译期间收到这样的错误:
/usr/bin/ld: cannot find -lzlib
我做了一些Googl'ing并且不断遇到同样类型的不同问题,人们会说确保.so文件实际存在,如果没有,则创建一个符号链接到版本化文件,例如zlib. so.1.2.8.但是,当我检查时,zlib.so DID存在.所以,我想,肯定不会是问题.
我在互联网上发现了另一篇帖子,建议用LD_DEBUG = all运行make:
LD_DEBUG=all make
虽然我得到了TON的调试输出,但实际上并没有帮助.它增加了比其他任何东西更多的混乱.所以,我正要放弃.
然后,我有一个顿悟.我想实际检查ld命令的帮助文本:
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
丁丁丁丁
所以,最后修复它,以便我可以使用我自己的ZLIB版本(而不是捆绑版本)编译MySQL:
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
瞧!
Sau*_*ola 175
如果您的图书馆名称是,libxyz.so并且它位于路径上说:
/home/user/myDir
然后将其链接到您的程序:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
tri*_*eee 38
似乎没有任何答案可以解决首先未能安装所需库的常见初学者问题.
在Debianish平台上,如果libfoo缺少,你可以经常安装类似的东西
apt-get install libfoo-dev
-dev软件包的版本是开发工作所必需的,甚至是简单的开发工作,例如编译链接到库的源代码.
包名有时需要一些装饰(libfoo0-dev?   foo-dev没有lib前缀?等),或者您可以简单地使用您的发行包搜索来精确找出哪些包提供特定文件.
(如果不止一个,你需要找出他们之间的差异.挑选最酷或最流行的是一个共同的捷径,但对于任何认真的开发工作来说都不是一个可接受的程序.)
对于其他架构(最值得注意的是RPM),类似的程序适用,但细节会有所不同.
fro*_*tto 34
当G ++说cannot find -l<nameOfTheLibrary>,这意味着G ++所盼望的文件lib{nameOfTheLibrary}.so,但它无法找到它的共享库搜索路径,默认指向/usr/lib,并/usr/local/lib和其他地方可能.
要解决此问题,您应该lib{nameOfTheLibrary}.so在这些搜索路径中提供库文件()或使用-L命令选项.除了默认路径之外,-L{path}告诉G ++(实际ld)在路径{path}中查找库文件.
示例:假设您有一个库/home/taylor/libswift.so,并且您想要将您的应用程序链接到此库.在这种情况下,您应该提供-l以下选项:
g++ main.cpp -o main -L/home/taylor -lswift
注1:lib选项得到库名没有 .so和libswift.so.1.2在它的开始和结束.
注意2:在某些情况下,库文件名后面跟着它的版本libswift.so.1.2.在这些情况下,G ++也找不到库文件.解决此问题的一个简单解决方法是创建一个libswift.so被调用的符号链接LD_LIBRARY_PATH.
当您将应用程序链接到共享库时,每当您运行应用程序时,都需要该库保持可用.在运行时,您的应用程序(实际上是动态链接器)在其中查找其库libswift.so.它是一个存储路径列表的环境变量.
例如:在我们的情况下,libswift.so例如,动态链接器找不到LD_LIBRARY_PATH在libswift.so(其指向默认搜索路径).要解决此问题,您应该附加路径cannot find -l<nameOfTheLibrary>所在的变量.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
Fin*_*sen 31
在使用g++via makedefine进行编译期间,LIBRARY_PATH使用该-L选项更改Makefile可能不合适.我把我的额外库放进去,/opt/lib所以我做了:
$ export LIBRARY_PATH=/opt/lib/
然后运行make成功编译和链接.
要使用共享库运行程序,请定义:
$ export LD_LIBRARY_PATH=/opt/lib/
在执行程序之前.
首先,您需要知道以下命名规则lxxx:
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst
lc手段libc.so,lltdl手段libltdl.so,lXtst手段libXts.so.
所以,它是lib+ lib-name+.so
一旦我们知道了名称,我们就可以locate用来查找这个lxxx.so文件的路径.
$ 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/libiconv.so /usr/lib64/
完成!
参考:https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
编译程序时,必须提供库的路径。在g ++中,使用-L选项:
g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
我在使用 Centos 7.8 的新虚拟机上编译 LXC 时遇到了这个问题。我尝试了以上所有方法但失败了。有人建议删除-static flag from the compiler configuration but I didn't want to change anything.
唯一有帮助的是安装glibc-static并重试。希望对某人有帮助。