2016-04-01 12 views
0

Ich habe boost::system und boost::serialization von mit dem älteren GCC ABI (https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html) kompiliert wegen etwas älterer Drittparteicode, den ich verwende.Widersprüchliche Boost-Versionen

ich sie /usr/local/lib gebaut hatte, die bereits als gültigen Pfad zu dem Linker (ich andere Bibliotheken auch dort) gesetzt ist, und umbenannt sie:

$ 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 

Standard, sind Mainstream-Boost-Bibliotheken unter /usr/lib wie üblich. Was passiert, ist, dass, wenn ich jedes Stück Code-Link auf diese speziellen Bibliotheken mit dem benutzerdefinierten Flags -lboost_system_old_abi und -lboost_serialization_old_abi, wird die resultierende binären die Standard-Boost-Bibliotheken verknüpft werden:

$ 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) 

die ziemlich seltsam ist, weil Wenn Sie die ursprünglichen Flags -lboost_system und -lboost_serialization verwenden, kann gcc aufgrund neuer/alter ABI-Inkompatibilitäten nicht mit der Standardverstärkung verknüpft werden.

Was genau passiert hier?

Antwort

1

Das Problem ist, dass nur das Umbenennen Ihrer benutzerdefinierten Bibliotheken nicht ausreicht. Der Bibliotheksname ist in die Bibliothek als soname eingebettet (Sie können es mit dem Befehl readelf -d sehen) und wird verwendet, wenn Ihre Anwendung mit der Bibliothek gemocht wird. Grundsätzlich werden die Sonames aus den benutzerdefinierten Bibliotheken als Abhängigkeiten in Ihre Anwendungsbinärdatei eingefügt, und da sie den offiziellen Boost-Bibliotheksnamen entsprechen, werden die falschen Binärdateien zur Laufzeit geladen.

Sie müssen sicherstellen, dass die benutzerdefinierten Boost-Bibliotheken ordnungsgemäß im Build-Prozess benannt werden. Sie können dies versuchen, indem Sie die Option --buildid=old_abi zu Ihrer b2-Befehlszeile hinzufügen.

Verwandte Themen