我正在尝试编译我的程序,它返回此错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的makefile中,我使用命令g++
并链接到我的库,这是我的库位于另一个目录的符号链接。
是否可以选择添加以使其正常工作?
如果您的图书馆名称是libxyz.so
并且位于路径上,请说:
/home/user/myDir
然后将其链接到您的程序:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
除了已经给出的答案之外,也可能是* .so文件存在但未正确命名的情况。或者可能是* .so文件存在但它由另一个用户/ root拥有的情况。
问题1:名称不正确
如果您将文件链接为-l<nameOfLibrary>
,那么库文件名必须是lib<nameOfLibrary>
形式如果您只有<nameOfLibrary>.so
文件,请将其重命名!
问题2:错误的所有者
要验证这不是问题 - 做
ls -l /path/to/.so/file
如果该文件由root或其他用户拥有,则需要执行此操作
sudo chown yourUserName:yourUserName /path/to/.so/file
我试图链接的库竟然有一个非标准名称(即没有前缀'lib'),所以他们建议使用这样的命令来编译它 -
gcc test.c -Iinclude lib/cspice.a -lm
这是我笔记本电脑的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成功安装!
要确定链接器要查找的内容,请以详细模式运行它。
例如,我在尝试使用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
ding, 定, 定...
所以,最后修复它,以便我可以使用我自己的ZLIB版本(而不是捆绑版本)编译MySQL:
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
瞧!
似乎没有任何答案可以解决首先未能安装所需库的常见初学者问题。
在Debianish平台上,如果缺少libfoo
,你可以经常安装它
apt-get install libfoo-dev
-dev
版本的软件包是开发工作所必需的,甚至是简单的开发工作,例如编译链接到库的源代码。
包名有时需要一些装饰(libfoo0-dev
?foo-dev
没有lib
前缀?等),或者你可以简单地使用你的发行版的package search来找出哪些包提供了特定的文件。
(如果不止一个,你需要找出他们之间的差异。挑选最酷或最流行的是一个共同的捷径,但对于任何认真的开发工作来说都不是一个可接受的程序。)
对于其他架构(最值得注意的是RPM),类似的程序适用,但细节会有所不同。
在通过g++
编译make
期间定义LIBRARY_PATH
,如果用-L
option更改Makefile可能不合适。我把我的额外库放在/opt/lib
所以我做了:
$ export LIBRARY_PATH=/opt/lib/
然后运行make
成功编译和链接。
要使用共享库运行程序,请定义:
$ export LD_LIBRARY_PATH=/opt/lib/
在执行程序之前。
当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
上有一个库,并且您想将您的应用程序链接到此库。在这种情况下,您应该为g ++提供以下选项:
g++ main.cpp -o main -L/home/taylor -lswift
-l
选项在其开头和结尾获取没有lib
和.so
的库名。libswift.so.1.2
。在这些情况下,g ++也找不到库文件。解决此问题的一个简单解决方法是创建一个名为libswift.so.1.2
的libswift.so
的符号链接。当您将应用程序链接到共享库时,只要您运行应用程序,就必须保持库可用。在运行时,您的应用程序(实际上是动态链接器)在LD_LIBRARY_PATH
中查找其库。它是一个存储路径列表的环境变量。
示例:在我们的libswift.so
示例中,动态链接器无法在libswift.so
中找到LD_LIBRARY_PATH
(指向默认搜索路径)。要解决此问题,您应该使用路径libswift.so
附加该变量。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
首先,您需要知道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/
完成!
ref:https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
编译程序时,必须提供库的路径;在g ++中使用-L选项:
g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
如果符号链接是动态库.so,也可能会出现此错误,但由于遗留原因,-static
出现在链接标志中。如果是这样,请尝试删除它。
检查库的位置,例如lxxx.so:
locate lxxx.so
如果它不在/usr/lib
文件夹中,请键入:
sudo cp yourpath/lxxx.so /usr/lib
完成。