我试图编译我的程序,它返回这个错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的makefile中,我使用命令g++并链接到我的库,这是一个符号链接到我的库位于另一个目录。
是否有一个选项添加,使其工作,请?
我试图编译我的程序,它返回这个错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的makefile中,我使用命令g++并链接到我的库,这是一个符号链接到我的库位于另一个目录。
是否有一个选项添加,使其工作,请?
当前回答
我在使用Centos 7.8的新VM上编译LXC时遇到了这个问题。我尝试了以上所有的方法,但都失败了。有人建议从编译器配置中删除-static标志,但我不想改变任何东西。
唯一有帮助的是安装glibc-static并重试。希望这能帮助到别人。
其他回答
要找出链接器正在寻找什么,请在verbose模式下运行它。
例如,我在尝试用ZLIB支持编译MySQL时遇到了这个问题。在编译过程中,我收到了这样一个错误:
/usr/bin/ld: cannot find -lzlib
我做了一些谷歌搜索,不断遇到不同的同类问题,人们会说,要确保.so文件确实存在,如果它不存在,那么就创建一个到版本文件的符号链接,例如,zlib.so.1.2.8。但是,当我检查时,zlib。确实存在。所以,我想,这肯定不是问题所在。
我在网上看到了另一篇文章,建议使用LD_DEBUG=all运行make:
LD_DEBUG=all make
虽然我得到了大量的调试输出,但实际上并没有什么帮助。这比其他任何事情都更让人困惑。所以,我打算放弃了。
然后,我有了一个顿悟。我想实际检查一下ld命令的帮助文本:
ld --help
由此,我想出了如何在verbose模式下运行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选项:
g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
在g++编译期间,如果使用-Loption改变Makefile可能不合适,则通过make define LIBRARY_PATH。我把额外的库放在/opt/lib中,所以我做了:
$ export LIBRARY_PATH=/opt/lib/
然后运行make以成功编译和链接。
使用共享库运行程序定义:
$ export LD_LIBRARY_PATH=/opt/lib/
在执行程序之前。
检查你的库的位置,例如lxxx.so:
locate lxxx.so
如果不在/usr/lib文件夹中,输入:
sudo cp yourpath/lxxx.so /usr/lib
完成了。
编译时
当g++说不能找到-l< nameoftheelibrary >时,这意味着g++查找的文件是lib{nameoftheelibrary}。但它无法在共享库搜索路径中找到它,而共享库搜索路径默认指向/usr/lib和/usr/local/lib或者其他地方。
要解决这个问题,您应该在这些搜索路径中提供库文件(lib{nameoftheelibrary}.so),或者使用-L命令选项。-L{path}告诉g++(实际上是ld)在默认路径之外查找路径{path}中的库文件。
示例:假设在/home/taylor/libswift. .有一个库你想把你的应用链接到这个库。在这种情况下,你应该为g++提供以下选项:
g++ main.cpp -o main -L/home/taylor -lswift
注意1:-l选项在开始和结束时获取库名,不包含lib和.so。 注意2:在某些情况下,库文件名后面跟着它的版本,例如libswift.so.1.2。在这些情况下,g++也无法找到库文件。解决这个问题的一个简单方法是创建一个到libswift.so.1.2的符号链接,称为libswift.so。
运行时
当你将你的应用链接到一个共享库时,库必须在你运行应用时保持可用。在运行时,你的应用(实际上是动态链接器)在LD_LIBRARY_PATH中寻找它的库。它是一个存储路径列表的环境变量。
示例:在我们的libswift。例如,动态链接器找不到libswift。因此在LD_LIBRARY_PATH(指向默认搜索路径)中。要解决这个问题,您应该将该变量附加到路径libswift。现在也是这样。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor