g++を使用するときのldエラー "/opt/bin/ld: /lib/libm.so.6の検索中に互換性のない/lib/libm.so.6をスキップしています"

g++を使用するときのldエラー

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

#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

おすすめ記事