我正在尝试使用CMake编译引用Python的c ++项目。我正在使用Cygwin,我在Cygwin中有Python2.7源文件。
例如:
PyObject *l = PyList_New(0);
在线帮助建议我添加-lpython2.7链接器标志。我不是在CMake中正确添加这个吗?否则为什么我仍然不能使用Python库以及如何解决这个问题呢?
编译行:
C:\cygwin64\bin\cmake.exe --build "C:\Users\...\.clion10\system\cmake\generated\3e6845d6\3e6845d6\Release" --target projectname -- -j 4
CMakeList.txt文件:
cmake_minimum_required(VERSION 2.8.4)
project(projectname)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpython2.7")
set(SOURCE_FILES
src/cpp/...
src/cpp/...
src/cpp/..
src/cpp/...
src/cpp/...)
add_executable(projectname ${SOURCE_FILES})
错误......
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaeb4): undefined reference to `PyDict_New'
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaeb4): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `PyDict_New'
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaec4): undefined reference to `PyList_New'
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaec4): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `PyList_New'
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaf0d): undefined reference to `PyDict_New'
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaf0d): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `PyDict_New'
CMakeFiles/spot.dir/src/cpp/OBwrapper.cpp.o:OBwrapper.cpp:(.text+0xaf25): undefined reference to `PyString_FromString'
...and so on....
答案 0 :(得分:4)
你误解了CMake的方式:在使用之前你应该找到它!即确保构建程序包所需的一切在构建主机上可用且可用。否则,浪费一个(编译)时间(比如2小时)然后得到一个错误,找不到某个头/库/可执行文件就不好了。因此,在CMake运行时,您最好确保您需要的一切都在这里。要做到这一点,CMake有很多工具。
考虑您的特定情况:您需要找到Python库,否则无法构建。为此,您应该使用find_package
,如下所示:
find_package(PythonLibs REQUIRED)
如果需要,请查看documentation并提供其他选项(如版本)。您不应该在CMakeLists.txt
中使用硬编码路径,否则您的项目将无法真正移植(并且很可能您将成为唯一可以构建它的人问题)。相反,Python libs finder模块将提供稍后需要使用的变量,如果没有找到任何内容,则会失败。
如果CMake没有错误,你可以使用找到的Python库。首先,您需要更新#include
路径:
include_directories(${PYTHON_INCLUDE_DIRS})
然后告诉链接器您的可执行文件projectname
需要与Python库链接:
add_executable(projectname ${SOURCE_FILES})
target_link_libraries(projectname ${PYTHON_LIBRARIES})
再次尝试避免直接修改CMAKE_CXX_FLAGS
(和其他人) - 有一大堆调用全局和/或每个目标。其中一些是:
add_definitions
定义/取消定义宏include_directories
更新#include
路径add_compile_options
添加其他编译器选项link_directories
更新链接器搜索路径