我正在尝试编译我的程序,但返回了以下错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的 makefile 中,我使用了 g++
命令,并链接到我的库,该库是指向另一个目录中的库的符号链接。请问是否有任何选项可以添加,以使它能够正常工作?
我正在尝试编译我的程序,但返回了以下错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的 makefile 中,我使用了 g++
命令,并链接到我的库,该库是指向另一个目录中的库的符号链接。/usr/bin/ld: cannot find -lzlib
我进行了一些谷歌搜索,并发现许多人都遇到了不同类型的相同问题,他们会建议确保 .so 文件实际上存在并且如果不存在,则创建指向版本化文件的符号链接,例如 zlib.so.1.2.8。但是,当我检查时,zlib.so 是存在的。因此,我想,这肯定不是问题所在。
我在互联网上找到了另一篇文章,建议使用 LD_DEBUG=all 运行 make:
LD_DEBUG=all make
虽然我获得了大量的调试输出,但它实际上并没有帮助。它只增加了更多的困惑。所以,我差点放弃。
然后,我有了顿悟。我想去查看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
看这里!
如果你的库名是libxyz.so
,并且它位于路径上:
/home/user/myDir
然后将其链接到您的程序中:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
似乎没有任何答案解决了初学者常见的无法安装所需库的问题。
在Debianish平台上,如果缺少libfoo
,你可以尝试使用以下命令安装:
apt-get install libfoo-dev
在开发工作中,即使是编译源代码以链接到库这样的微不足道的开发工作,也需要使用软件包的-dev
版本。
软件包名称有时需要一些修饰(例如libfoo0-dev
?没有lib
前缀的foo-dev
?等等),或者您可以使用发行版的软件包搜索来确定哪些软件包提供特定的文件。
(如果有多个软件包,则需要了解它们之间的区别。选择最酷或最流行的是常见的快捷方式,但对于任何严肃的开发工作都不是可接受的程序。)
对于其他架构(尤其是RPM),类似的程序适用,但细节会有所不同。
apt-get install libperl-dev
为我解决了这个问题。谢谢 :) - Andrew Newbyyum install openssl-devel
就解决了它。 - djluko1. apt install <package_name> != apt install <library_for_gcc_name>
也就是说:
1. apt install sqlite3 != apt install libsqlite3-dev
和
2. apt install dbus != apt install libdbus-1-dev libdbus-glib-1-dev
你必须确保它是gcc的库! - John Huynh当 g++ 报错 cannot find -l<nameOfTheLibrary>
时,意味着 g++ 在默认的共享库搜索路径(/usr/lib
和 /usr/local/lib
)里查找文件 lib{nameOfTheLibrary}.so
,但是没有找到。
要解决这个问题,你可以将库文件 (lib{nameOfTheLibrary}.so
) 提供到这些搜索路径中或者使用 -L
命令选项。 -L{path}
告诉 g++ (实际上是 ld
) 在默认路径之外的路径 {path}
查找库文件。
示例:假设你在 /home/taylor/libswift.so
路径下有一个库文件,并且你想要将你的应用与该库链接起来。那么你应该向 g++ 提供以下选项:
g++ main.cpp -o main -L/home/taylor -lswift
Note 1: -l
选项返回库名,但不包含其开头的lib
和结尾的.so
。
Note 2: 在某些情况下,库文件名后跟其版本号,例如libswift.so.1.2
。在这些情况下,g++也找不到库文件。解决此问题的简单方法是创建一个指向libswift.so.1.2
的符号链接,称为libswift.so
。
当您将应用链接到共享库时,要求该库在运行应用程序时始终可用。在运行时,您的应用程序(实际上是动态链接器)在LD_LIBRARY_PATH
中查找其库。它是一个存储路径列表的环境变量。
示例:在我们的libswift.so
示例中,动态链接器无法在LD_LIBRARY_PATH
中找到libswift.so
(该变量指向默认搜索路径)。要解决此问题,您应该在该变量中追加包含libswift.so
的路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
.so
文件复制到/usr/lib
之前,我一直忽略所有答案,但是我很感兴趣是否可以使用export
来解决问题。尽管在make
后的安装过程继续了更长时间,但出现了另一个错误。这次,找不到.so.0
文件,但是.so
和.so.0
文件都在我从源代码构建依赖包的目录中。您能帮忙解决吗? - A.Ametov如果使用make
通过g++
进行编译时,可能不适合使用-L
选项更改Makefile,则应定义LIBRARY_PATH
。我将我的额外库放在了/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
+ 库名称
+ .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/
完成!locate
被安装并定期运行时才可以使用。一个简单的解决方法是在整个磁盘上运行find
,但这会花费时间。如果您经常需要运行此操作,请考虑安装locate
以降低(交互式、人为的)成本。 - tripleeelibXXX.so
文件。例如:ln -s libasound.so.2 libasound.so
。 - RyanNerd在编译程序时,您必须提供库的路径;在g++中使用-L选项:
g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
ccmake
中更改哪个属性,以便创建带有链接标志的 Makefile
?我想将我的 -lARToolkitPlus
标志链接到一个路径。 - Shashwat我在一台全新的CentOS 7.8虚拟机上编译LXC时遇到了问题。尝试了以上所有方法都失败了。一些人建议从编译器配置中删除-static
标志,但是我不想改变任何东西。
唯一有帮助的方法是安装glibc-static
并重试。希望能对某人有所帮助。
这是我的笔记本电脑的Ubuntu信息。
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
locate libboost_filesystem
locate libboost_system
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已成功安装!
/usr/lib
中的任何内容;这个目录应该完全由你的包管理器来管理。 - tripleee-l<nameOfLibrary>
,则库文件名称必须采用lib<nameOfLibrary>
的形式。如果您只有<nameOfLibrary>.so
文件,请将其重命名!ls -l /path/to/.so/file
sudo chown yourUserName:yourUserName /path/to/.so/file