Положение флага линкера в CMake 3.5 - PullRequest
0 голосов
/ 24 января 2020

У меня довольно странный вопрос: как заставить CMake 3.5 поставить флаги компоновщика ПОСЛЕ файлов? Я пытаюсь скомпилировать C ++, который вызывает Python скрипт. У меня есть две эти строки в моем CMakeList. cpp:

add_executable           (Python_trivium PyCall.cpp) 
set_target_properties (Python_trivium PROPERTIES  COMPILE_FLAGS "${PYTHON_CFLAGS}" Python_trivium PRIVATE "${PYTHON_LDFLAGS}")

Это приводит к ошибке связывания. С "make VERBOSE = 1" я вижу, что команда компоновщика выглядит следующим образом:

/usr/bin/c++     -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions CMakeFiles/Python_trivium.dir/PyCall.cpp.o  -o Python_trivium 

Где флаги находятся ДО файлов. Я получаю ошибку «неопределенная ссылка» для каждой команды из Python .h, например

/home/portolan/emanuele/MAST_project/pyhelper.hpp:12: undefined reference to `Py_Initialize'

Если я инвертирую и ставлю флаги ПОСЛЕ файлов, все работает:

/usr/bin/c++   CMakeFiles/Python_trivium.dir/PyCall.cpp.o  -o Python_trivium   -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions 

Есть ли способ попросить CMake отформатировать командную строку компоновщика таким образом?

Спасибо, Мишель

1 Ответ

2 голосов
/ 24 января 2020

Я обнаружил, что моя ошибка заключалась в попытке сделать это вручную. CMake может сделать это лучше для меня:

find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
message("PYTHONLIBS_VERSION_STRING: ${PYTHONLIBS_VERSION_STRING}")

К сожалению, он находит 3,5, а мне нужно 2,7 ....

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