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
がリンクすることはできません今何を確認できますか?ヒントは大歓迎です。ありがとう!
「/ opt/rh/devtoolset-4/root/usr/bin/C++」というブーストが作成されたとき、コンパイラは同じですか?/usrと/ opt/rh/devtoolset-4/root/usrにC++ヘッダーがあり、一致しない場合は、何らかの問題が発生する可能性があります。 –
@ J.J.Hakalaもちろん、私は安全版を使っていました。図書館の弦をグレープすることで、あなたのためにそれを証明しましょう。待って、ワット?ブーストビルドは 'scl enable devtoolset-4'を尊重していませんか? –
@ J.J.Hakalaあなたは正しいです。 Boostが正しく構築されていないことを確認しました。あなたが答えを加えることができるなら、私はそれを正しいものとしてマークします。ありがとう! –