使用CMake在C ++中使用未定义的Python引用

时间:2014-11-16 02:19:43

标签: c++ cmake cython clion

我正在尝试使用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....

1 个答案:

答案 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(和其他人) - 有一大堆调用全局和/或每个目标。其中一些是: