usr / bin / ld:找不到-l <nameOfTheLibrary>

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

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

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

有没有可以添加的选项使其工作?

如果你的库名称是说libxyz.so ,它位于path说:

 /home/user/myDir 

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

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

要找出链接器正在寻找什么,请以详细模式运行它。

例如,我在尝试编译支持ZLIB的MySQL时遇到了这个问题。 在编译期间,我收到了这样的错误:

 /usr/bin/ld: cannot find -lzlib 

我做了一些Googl'ing,并不断遇到同类问题,人们会说确保.so文件实际存在,如果不存在,则创build一个符号链接到版本文件,例如zlib。 so.1.2.8。 但是,当我检查,zlib.so DID存在。 所以,我想,这肯定不是问题。

我在互联网上发现了另外一个post,build议用LD_DEBUG = all运行make:

 LD_DEBUG=all make 

虽然我得到了一个TON的debugging输出,但实际上并没有帮助。 它比其他任何事情都增加了更多的困惑。 所以,我即将放弃。

然后,我顿悟了一下。 我想实际检查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 

瞧!

在使用g++编译期间,如果使用-L选项更改Makefile可能不合适,请make define LIBRARY_PATH 。 我把我的额外的库放在/opt/lib所以我做了:

 $ export LIBRARY_PATH=/opt/lib/ 

然后运行成功编译和链接。

要使用共享库运行程序,请定义:

 $ export LD_LIBRARY_PATH=/opt/lib/ 

在执行程序之前。

编译时间

当G ++说cannot find -l<nameOfTheLibrary> ,这意味着G ++查找文件lib{nameOfTheLibrary}.so ,但是在共享库searchpath中找不到它,默认情况下它指向/usr/lib /usr/local/lib和别的地方。

要解决此问题,您应该在这些searchpath中提供库文件( lib{nameOfTheLibrary}.so )或使用-L命令选项。 -L{path}告诉G ++(实际上ld )除了缺省path之外,还要在path{path}中查找库文件。

例如:假设你在/home/taylor/libswift.so有一个库,并且你想把你的应用程序链接到这个库。 在这种情况下,您应该为G++提供以下选项:

 g++ main.cpp -o main -L/home/taylor -lswift 
  • 注1-l选项在开始和结束时获取不带 lib.so的库名称。

  • 注2 :在某些情况下,库文件名后跟版本,例如libswift.so.1.2 。 在这些情况下,G ++也找不到这个库文件。 解决这个问题的一个简单的解决方法是创build一个名为libswift.so的符号链接。


运行

当您将您的应用程序链接到共享库时,需要该库在您运行应用程序时保持可用。 在运行时,你的应用程序(实际上是dynamic链接器)在LD_LIBRARY_PATH查找它的库。 这是一个存储path列表的环境variables。

例如:在我们的libswift.so例子中,dynamic链接libswift.soLD_LIBRARY_PATH (它指向默认searchpath)中找不到libswift.so 。 要解决这个问题,你应该在pathlibswift.so添加那个variables。

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor 

似乎没有任何答案能够解决初始化无法安装所需库的初学者问题。

在Debian平台上,如果缺lesslibfoo ,你可以经常使用类似的东西来安装它

 apt-get install libfoo-dev 

开发工作需要包的-dev版本,甚至是一些简单的开发工作,比如编译链接到库的源代码。

包名有时需要一些装饰( libfoo0-devfoo-dev没有lib前缀?等),或者你可以简单地使用你的发行包search来找出哪些包提供了一个特定的文件。

(如果有不止一个,你需要找出它们之间的区别,挑选最酷的或最受欢迎的是一个共同的捷径,但对于任何严肃的开发工作来说,这是一个不可接受的过程。

对于其他体系结构(最显着的是RPM),类似的程序适用,但细节会有所不同。

如果符号链接是针对dynamic库的.so,那么也会出现此错误,但是由于遗留原因,链接标志中会出现静态。 如果是这样,请尝试删除它。

编译程序时,必须提供库的path; 在g ++中使用-L选项:

 g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar 

我试图链接的库竟然有一个非标准的名字(即没有用'lib'作为前缀),所以他们build议使用这样的命令来编译它 –

gcc test.c -Iinclude lib/cspice.a -lm

首先,你需要知道lxxx的命名规则:

 /usr/bin/ld: cannot find -lc /usr/bin/ld: cannot find -lltdl /usr/bin/ld: cannot find -lXtst 

lc表示libc.solltdl表示libltdl.solXtst表示libXts.so

所以,它是lib + lib-name + .so


一旦我们知道了名字,我们就可以使用locatefind这个lxxx.so文件的path。

 $ 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/

完成!

ref: https : //i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html