![g++ 使用時の ld エラー「/opt/bin/ld: /lib/libm.so.6 の検索時に互換性のない /lib/libm.so.6 をスキップします」](https://rvso.com/image/83695/g%2B%2B%20%E4%BD%BF%E7%94%A8%E6%99%82%E3%81%AE%20ld%20%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8C%2Fopt%2Fbin%2Fld%3A%20%2Flib%2Flibm.so.6%20%E3%81%AE%E6%A4%9C%E7%B4%A2%E6%99%82%E3%81%AB%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%AE%E3%81%AA%E3%81%84%20%2Flib%2Flibm.so.6%20%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%8D.png)
非常に単純なプログラムのコンパイルをテストしようとすると、このエラーが発生します。
#ifdef __cplusplus
extern "C"
#endif
int
main ()
{
return 0;
}
g++ を使用してコンパイルすると、次のエラー メッセージが表示されました。
g++ -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
/opt/bin/ld: skipping incompatible /lib/libm.so.6 when searching for /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libmvec.so.1
しかし、コンパイルは gcc によって成功します:
gcc -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
システムは 32 ビットと 64 ビットのハイブリッドであり、すべての 32 ビット プログラムとライブラリは /lib、/bin、/sbin などにあります。すべての 64 ビット プログラムとライブラリは /opt/lib、/opt/bin、opt/sbin などにあります。/lib/libm.so.6 は間違ったバージョンであり、正しいバージョンは /opt/lib にあることはわかっています。また、gcc、g++、ld はすべて 64 ビットであり、/opt サブフォルダーにあり、gcc を使用して他の非常に複雑なプログラムを正常にコンパイルしました。ファイル /lib/libm.so.6 は /lib/libm-2.6.1.so へのシンボリック リンクです。ファイル /opt/lib/lim.so.6 は /opt/lib/libm-2.22.so* へのシンボリック リンクです。
file /opt/lib/libm-2.22.so
/opt/lib/libm-2.22.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, for GNU/Linux 2.6.32, stripped
file /lib/libm-2.6.1.so
/lib/libm-2.6.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.8, stripped
g++ --version
g++ (OpenWrt GCC 4.8.5) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
答え1
発生している問題を再現できないため、いくつかのヒントを提供することしかできません。
これを見て下さい答えg++
を使用すると、リンカー フェーズ中にいくつかの追加ライブラリが自動的に追加されます。コンパイル/リンク時にこのオプションを使用する-v
と、含まれるライブラリをより明確に把握できます。
-v
コンパイルの各段階を実行するために実行されたコマンドを (標準エラー出力に) 出力します。また、コンパイラ ドライバ プログラム、プリプロセッサ、およびコンパイラ自体のバージョン番号も出力します。
g++
auto はリンカー フェーズに追加されるのでlibstdc++
、パス内のどこで宣言されているかを確認してください。
$ ldconfig -p | grep stdc++
libstdc++.so.6 (libc6,x86-64) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6