2016-04-01 2 views
0

Я скомпоновал boost::system и boost::serialization с более старым GCC ABI (https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html) из-за какого-то старого стороннего кода, который я использую.Конфликтующие форсированные версии

я их построили для /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 как обычно. Что происходит, что когда я связать любой кусок кода этих конкретных библиотек с пользовательскими флагами -lboost_system_old_abi и -lboost_serialization_old_abi, полученный двоичный будет связан с библиотеками наддува по умолчанию:

$ 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 и -lboost_serialization, gcc не может даже ссылаться на повышение по умолчанию из-за новой/старой несовместимости ABI.

Так что же здесь происходит?

ответ

1

Проблема в том, что просто переименования ваших пользовательских встроенных библиотек недостаточно. Имя библиотеки встроено в библиотеку как soname (вы можете увидеть ее с помощью команды readelf -d) и используется, когда ваше приложение понравилось в библиотеке. В принципе, сонаты из пользовательских библиотек помещаются как зависимые в ваш двоичный код приложения, и поскольку они совпадают с именами официальных имен Boost, неправильные двоичные файлы загружаются во время выполнения.

Вы должны убедиться, что пользовательские библиотеки Boost правильно названы в процессе сборки. Вы можете попробовать сделать это, добавив опцию --buildid=old_abi в свою командную строку b2.

Смежные вопросы