2016-04-01 1 views
0

私は古いGCC ABI(https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html)で、使用している古いサードパーティコードのため、boost::systemboost::serializationをコンパイルしました。相反するブーストバージョン

私は彼らがすでにリンカへの有効なパスとして設定されている/usr/local/libに内蔵されていた(私はそこにも、他のライブラリを使用)、およびそれらを名前を変更:

$ ls /usr/local/lib/libboost_* 

/usr/local/lib/libboost_serialization_old_abi.so 
/usr/local/lib/libboost_serialization_old_abi.so.1.60.0 
/usr/local/lib/libboost_system_old_abi.so 
/usr/local/lib/libboost_system_old_abi.so.1.60.0 
/usr/local/lib/libboost_wserialization_old_abi.so 
/usr/local/lib/libboost_wserialization_old_abi.so.1.60.0 

デフォルト、主流のブーストライブラリは下です/usr/lib通常通り。ので、

$ ldd darwin_socket 

linux-vdso.so.1 (0x00007ffd137ea000) 
/usr/local/webots/resources/projects/robots/darwin-op/libraries/darwin/libdarwin.so (0x00007fcb9edaa000) 
libipsocket.so.1 => /usr/local/lib/libipsocket.so.1 (0x00007fcb9eb7b000) 
libboost_system.so.1.60.0 => /usr/lib/libboost_system.so.1.60.0 (0x00007fcb9e977000) 
libboost_serialization.so.1.60.0 => /usr/lib/libboost_serialization.so.1.60.0 (0x00007fcb9e739000) 
libController.so => not found 
libCppController.so => not found 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fcb9e3b7000) 
libm.so.6 => /usr/lib/libm.so.6 (0x00007fcb9e0b2000) 
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fcb9de9c000) 
libc.so.6 => /usr/lib/libc.so.6 (0x00007fcb9dafb000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fcb9efc1000) 
librt.so.1 => /usr/lib/librt.so.1 (0x00007fcb9d8f3000) 
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fcb9d6d6000) 

かなり奇妙です:何が起こるかというと、私はカスタムフラグ-lboost_system_old_abi-lboost_serialization_old_abiと、これらの特定のライブラリへのコードのどの部分をリンクする際、結果のバイナリはデフォルトのブーストライブラリにリンクされるということですオリジナルの-lboost_system-lboost_serializationフラグを使用すると、gccは新しい/古いABIの非互換性のためにデフォルトのboostにリンクすることさえできません。

ここでは正確に何が起こっていますか?

答えて

1

カスタムビルドライブラリの名前を変更するだけでは不十分です。ライブラリ名はsonamereadelf -dコマンドで確認できます)のようにライブラリに埋め込まれており、ライブラリにアプリケーションが好きなときに使用されます。基本的には、カスタムライブラリからのsonamesは、アプリケーションバイナリに依存関係として置かれます。公式のBoostライブラリ名と同じであるため、実行時に誤ったバイナリが読み込まれます。

カスタム構築されたBoostライブラリの名前がビルドプロセスで正しく指定されていることを確認する必要があります。これを行うには、--buildid=old_abiオプションをb2コマンドラインに追加してください。