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?