我正在尝试编译我的程序并返回此错误:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
在我的 makefile 中,我使用命令 g++
并链接到我的库,这是指向位于其他目录中的库的符号链接(symbolic link)。
请问有没有可以添加的选项?
要弄清楚链接器在寻找什么,请在详细模式下运行它。
例如,我在尝试使用 ZLIB 支持编译 MySQL 时遇到了这个问题。我在编译过程中收到这样的错误:
/usr/bin/ld: cannot find -lzlib
我做了一些谷歌搜索,并不断遇到相同类型的不同问题,人们会说要确保 .so 文件确实存在,如果不存在,则创建指向版本化文件的符号链接(symbolic link),例如,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
瞧!
我是一名优秀的程序员,十分优秀!