Настройки линкера - PullRequest
       10

Настройки линкера

1 голос
/ 11 марта 2011

Я пытаюсь связать boost.python с моим приложением в cmake build-system. Самые важные части в моем CMakeList.txt :

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

find_package(Boost COMPONENTS filesystem system date_time python REQUIRED)

add_definitions(-Wall -g -msse2 -fPIC)

И, конечно, включая / связывая библиотеки / заголовки библиотек boost и python.

Теперь это не с:

/usr/bin/ld: libboost_python.a(from_python.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
libboost_python.a: could not read symbols: Bad value

Я решил пойти во временную папку сборки cmake и найти сгенерированный объектный файл (* .o) . Я применил команду для этого:

g++ -shared FILE.cpp.o -L/usr/lib -lboost_python -o MyModule.so

В результате я получил работоспособный модуль MyModule для python! Итак, давайте посмотрим на строку компоновщика cmake и найдем разницу. Я запустил make с VERBOSE = 1 :

/usr/bin/c++  -fPIC -g  -shared -Wl,-soname,libScript.so -o ../../lib/libScript.so CMakeFiles/LogManagerWrapper.cpp.o -Wl,-Bstatic -lboost_filesystem -lboost_system -lboost_date_time -lboost_python -Wl,-Bdynamic -lpython2.7 

Во время исключения некоторых частей флагов компоновщика я обнаружил, что моя проблема в -Wl, -Bstatic перед тем, как повысить список библиотек.

Интересно, откуда пришел этот аргумент, потому что я заметил Boost_USE_STATIC_LIBS OFF в CMakeList.txt.

Что не так?

1 Ответ

0 голосов
/ 13 марта 2011

Вы не показали код, который использует библиотеки Boost, поэтому я предполагаю, что это просто:

target_link_libraries(foo ${Boost_LIBRARIES})

Не могли бы вы добавить

message("XXX ${Boost_LIBRARIES}")

вокруг этого пункта? Я подозреваю, что напечатает список библиотек с расширением .a, которые затем CMake преобразует в этот -Wl,-Bstatic -lxxx. Изучите путь, по которому расположены библиотеки .a, и проверьте, есть ли аналоги .so. Я предполагаю, что на самом деле у вас есть только статические библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...