2016-08-07 7 views
1

CentOS 7 x64システムでは、-fPICを有効にして最新のBoost 1.61.0をビルドしました。 libboost_log.aをビルドしている動的ライブラリにリンクして、ライブラリのユーザにBoostをインストールする必要がないようにしています。 CentOS 7に同梱のGCC 4.8.5を使用して成功しましたが、devtoolset-4からGCC 5.2.1を使用していると失敗しました。 ./b2 -j6 -q -d+2 cxxflags=-fPIC cflags=-fPIC variant=release ブーストは、デフォルトでは-O3使用しています:私はブーストを建てどのようすべてのファイルがfPICでコンパイルされていても、ldは静的ライブラリをダイナミックライブラリにリンクできません

/opt/rh/devtoolset-4/root/usr/libexec/gcc/x86_64-redhat-linux/5.2.1/ld: /opt/boost/lib/libboost_log.a(attribute_name.o): relocation R_X86_64_32 against `_ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43' can not be used when making a shared object; recompile with -fPIC 
/opt/boost/lib/libboost_log.a: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 

はここでエラーです。私のプログラムはこうして-O3でも使われました。マイライブラリを構築するための

コマンド:libboost_log.aはFPICで構築されていることを /opt/rh/devtoolset-4/root/usr/bin/c++ -fPIC -O3 -g -DNDEBUG -shared -Wl,-soname,libfoobar.so.0 -o libfoobar.so.0.5 foobar.cc.o -L/opt/boost/lib /opt/boost/lib/libboost_filesystem.a /opt/boost/lib/libboost_log.a /opt/boost/lib/libboost_program_options.a -lpthread -Wl,-rpath,/opt/boost/lib

証明:

 
$ objdump -r /opt/boost/lib/libboost_log.a | grep _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 
0000000000000002 R_X86_64_32  _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 
0000000000000011 R_X86_64_32S  _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 
00000000000001a3 R_X86_64_32  _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 
00000000000001be R_X86_64_32S  _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 
000000000000001c R_X86_64_32S  _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 
0000000000000021 R_X86_64_32  _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 

思考: あなたはlibboost_filesystem.aは罰金リンク思わ見ることができるように、ちょうどlibboost_log.aがリンクすることはできません今何を確認できますか?ヒントは大歓迎です。ありがとう!

+0

「/ opt/rh/devtoolset-4/root/usr/bin/C++」というブーストが作成されたとき、コンパイラは同じですか?/usrと/ opt/rh/devtoolset-4/root/usrにC++ヘッダーがあり、一致しない場合は、何らかの問題が発生する可能性があります。 –

+0

@ J.J.Hakalaもちろん、私は安全版を使っていました。図書館の弦をグレープすることで、あなたのためにそれを証明しましょう。待って、ワット?ブーストビルドは 'scl enable devtoolset-4'を尊重していませんか? –

+0

@ J.J.Hakalaあなたは正しいです。 Boostが正しく構築されていないことを確認しました。あなたが答えを加えることができるなら、私はそれを正しいものとしてマークします。ありがとう! –

答えて

1

/OPT/RH/devtoolset-4 /ルートは/ usr/binに/ C++使用コンパイラは、の/ usr/binに/ C++以外のものです。これらの2つのコンパイラが異なるバージョンのC++ヘッダーを持つ場合、メソッドの異なるシンボルを持つライブラリを生成する可能性があります(ネームマングリング)。コンパイラのバージョンが異なる場合、リンクが失敗するその他の理由もあります。

各C++ライブラリをコンパイルするときに、少なくともメジャーバージョンのgccが同じになるように、C++コードをコンパイルすることをお勧めします。

+0

Boost Build(b2)が 'scl enable devtoolset-4'を尊重せず、'/usr/bin/g ++ 'を引き続き使用しているという根本的な理由を追加したいと思います。 'project-config.jam'で' gcc :: path/to/gcc'を使ってdevtoolset-4コンパイラを使うように言わなければなりませんでした。 –

関連する問題