非常に単純なプログラムのコンパイルをテストしようとすると、次のエラーが発生します。
#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