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.so
在LD_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-dev
? foo-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.so
, lltdl
表示libltdl.so
, lXtst
表示libXts.so
。
所以,它是lib
+ lib-name
+ .so
一旦我们知道了名字,我们就可以使用locate
find这个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