最初に、これが StackOverflow に関する初めての投稿であることをお知らせしたいと思います。非常に愚かな質問をして、自分を馬鹿にしないことを願っています。この問題について数日間グーグルで調べてきましたが、これまでのところ答えが見つかりませんでした。
状況は次のとおりです。
autotools で管理される C++ プロジェクトに取り組んでいます。ターゲット プラットフォームは、2 つのバージョンの gcc がインストールされた RHEL5 64 ビットです。
- /usr にインストールされた gcc 4.1.2
- /local/opt/gcc-4.3.5 にインストールされた gcc 4.3.5
デフォルトの gcc バージョン (4.1.2) でプロジェクトをビルドしている場合、すべて問題なく動作しますが、gcc 4.3.5 に切り替えると、リンク時に次のエラーが発生します。
/local/opt/gcc-4.3.5/lib/../lib/libstdc++.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
libtool は、コマンド ラインで libstdc++.so の 32 ビット バージョンへのパスをハードコーディングしたようですが、64 ビット バージョンである必要があります。より正確には、失敗する libtool 呼び出しは次のとおりです。
/bin/sh ./libtool --tag=CXX --mode=link g++ -m64 -o libfoo.la -rpath /local/opt/foo/lib src/foo/libfoo_la-bar1.lo src/foo/libfoo_la-bar2.lo
libtool によって次のように変換されます。
g++ -shared -nostdlib
/usr/lib/../lib64/crti.o
/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/crtbeginS.o
src/foo/.libs/libfoo_la-bar1.o
src/foo/.libs/libfoo_la-bar2.o
-Wl,--rpath
-Wl,/local/opt/gcc-4.3.5/lib/../lib
-Wl,--rpath
-Wl,/local/opt/gcc-4.3.5/lib/../lib
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/../../../../lib64
-L/lib/../lib64
-L/usr/lib/../lib64
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/../../..
/local/opt/gcc-4.3.5/lib/../lib/libstdc++.so
-lm -lc -lgcc_s
/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/crtendS.o
/usr/lib/../lib64/crtn.o
-m64 -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
デフォルトの gcc から gcc 4.3.5 に切り替えるために使用する方法は次のとおりです。
$ export PATH=/local/opt/gcc-4.3.5/bin:$PATH
$ export LD_LIBRARY_PATH=/local/opt/gcc-4.3.5/lib:/local/opt/gcc-4.3.5/lib64:$LD_LIBRARY_PATH
$ export GCC_HOME=/local/opt/gcc-4.3.5
私はこれらすべてのツールにまったく慣れていないので、何か間違ったことをしていると思います。これを修正する方法について誰かが私に手がかりを与えることができれば、私は非常に感謝しています.
乾杯