要弄清楚链接器正在寻找什么,请在详细模式下运行它。
例如,我在尝试编译具有 ZLIB 支持的 MySQL 时遇到了这个问题。我在编译过程中收到这样的错误:
/usr/bin/ld: cannot find -lzlib
我做了一些谷歌搜索,并不断遇到同类的不同问题,人们会说要确保 .so 文件确实存在,如果不存在,则创建指向版本化文件的符号链接,例如 zlib。所以.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
Voila!