C++ usr/bin/ld:找不到-l<;图书馆名称>;

C++ usr/bin/ld:找不到-l<;图书馆名称>;,c++,linux,g++,C++,Linux,G++,我试图编译我的程序,它返回以下错误: usr/bin/ld: cannot find -l<nameOfTheLibrary> usr/bin/ld:找不到-l 在我的makefile中,我使用命令g++并链接到我的库,这是指向位于其他目录上的库的符号链接 是否有一个选项可以添加以使其工作?编译程序时,必须提供库的路径;在g++中,使用-L选项: g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar 如果您的库名为sayli

我试图编译我的程序,它返回以下错误:

usr/bin/ld: cannot find -l<nameOfTheLibrary>
usr/bin/ld:找不到-l
在我的makefile中,我使用命令
g++
并链接到我的库,这是指向位于其他目录上的库的符号链接


是否有一个选项可以添加以使其工作?编译程序时,必须提供库的路径;在g++中,使用-L选项:

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

如果您的库名为say
libxyz.so
,并且它位于路径上,请说:

/home/user/myDir
然后将其链接到您的程序:

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

要了解链接器正在查找什么,请在详细模式下运行它

例如,我在尝试使用ZLIB支持编译MySQL时遇到了这个问题。在编译过程中,我收到了如下错误:

/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(想象一下):

这是我得到的输出:

==================================================
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:


在使用
g++
通过
make
定义
LIBRARY\u路径进行编译期间,如果使用
-L
选项更改Makefile可能不合适。我把我的额外库放在了
/opt/lib
中,所以我做了:

$ export LIBRARY_PATH=/opt/lib/
然后运行
make
,以成功编译和链接

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

$ export LD_LIBRARY_PATH=/opt/lib/
在执行程序之前。

编译时 当g++说
找不到-l
时,这意味着g++查找了文件
lib{nameoflibrary}.so
,但在共享库搜索路径中找不到它,默认情况下,该路径指向
/usr/lib
/usr/local/lib
以及其他地方

要解决此问题,您应该在这些搜索路径中提供库文件(
lib{nameoflibrary}.so
),或者使用
-L
命令选项
-L{path}
告诉g++(实际上是
ld
)除了默认路径之外,还要在path
{path}
中查找库文件

示例:假设您在
/home/taylor/libswift.so
有一个库,并且您希望将应用程序链接到此库。在这种情况下,您应该为g++提供以下选项:

g++ main.cpp -o main -L/home/taylor -lswift
  • 注意1
    -l
    选项获取库名,但不包含
    lib
    。因此
    在其开头和结尾

  • 注2:在某些情况下,库文件名后面跟着它的版本,例如
    libswift.so.1.2
    。在这些情况下,g++也无法找到库文件。一个简单的解决方法是创建一个到
    libswift.so.1.2
    的符号链接,称为
    libswift.so


运行时 当您将应用程序链接到共享库时,要求库在运行应用程序时始终可用。在运行时,您的应用程序(实际上是动态链接器)会在
LD\u LIBRARY\u PATH
中查找其库。它是一个存储路径列表的环境变量

示例:对于我们的
libswift.so
示例,动态链接器无法在
LD\u LIBRARY\u路径中找到
libswift.so
(指向默认搜索路径)。要解决此问题,您应该使用路径
libswift.so
附加该变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor

如果符号链接指向动态库,也可能导致此错误。因此,由于传统原因,链接标志中会出现
-static
。如果是这样,请尝试删除它。

我试图链接到的库的名称不是标准名称(即没有前缀“lib”),因此他们建议使用如下命令编译它-


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

似乎没有任何答案可以解决初学者一开始就无法安装所需库的常见问题

在Debianish平台上,如果缺少
libfoo
,您可以经常使用类似

apt-get install libfoo-dev
开发工作需要包的
-dev
版本,即使是一些琐碎的开发工作,例如编译源代码以链接到库

包名有时需要一些修饰(
libfoo0-dev
foo-dev
,不带
lib
前缀?等),或者您可以简单地使用发行版来确定哪些包提供了特定的文件

(如果不止一个,您需要找出它们的区别。选择最酷或最流行的是一条常见的捷径,但对于任何严肃的开发工作来说都不是一个可接受的过程。)


对于其他架构(最显著的是RPM),类似的过程也适用,尽管细节会有所不同。

首先,您需要了解
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
+
。所以


一旦我们知道了这个名字,我们就可以使用
locate
找到这个
lxxx的路径
apt-get install libfoo-dev
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst
$ 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
locate lxxx.so
sudo cp yourpath/lxxx.so /usr/lib
ls -l /path/to/.so/file
sudo chown yourUserName:yourUserName /path/to/.so/file
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