CMake 3.5 中的链接器标志位置

Linker flag positions in CMake 3.5

本文关键字:标志 位置 链接 CMake      更新时间:2023-10-16

我有一个很奇怪的问题:如何让 CMake 3.5 将链接器标志放在文件之后? 我正在尝试编译一个调用 Python 脚本的C++。我的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 以这种方式格式化链接器命令行?

谢谢 米歇尔

我发现我的错误在于尝试手动执行此操作。CMake 可以为我做得更好:

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

不幸的是,它找到了 3.5,而我需要 2.7....