プログラムをコンパイルしようとすると、次のエラーが返されます:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
私の makefile では、コマンドを使用してg++
、他のディレクトリにあるライブラリへのシンボリック リンクであるライブラリにリンクします。
動作させるために追加するオプションはありますか?
ベストアンサー1
リンカーが何を探しているのかを知るには、詳細モードで実行します。
たとえば、ZLIB サポートを使用して MySQL をコンパイルしようとしたときに、この問題に遭遇しました。コンパイル中に次のようなエラーが表示されました。
/usr/bin/ld: cannot find -lzlib
Google で検索してみたところ、同じ種類のさまざまな問題が次々と見つかりました。.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
チン、チン、チン…
そこで、最終的にこれを修正して、MySQL をバンドル版ではなく独自の ZLIB 版でコンパイルできるようにしました。
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
出来上がり!