2014-11-16 62 views
0

我想使用CMake编译引用Python的C++项目。我正在使用Cygwin,并且我在Cygwin中有Python2.7源文件。使用CMake在C++中未定义的Python引用

例如:

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

你能显示编译行 – Eric

+0

用编译行更新。 –

+0

难道你看不到包含-lpython2.7的行吗? – Eric

回答

3

你误解的CMake的方法:你应该在使用前的东西到找到吧!即确保构建软件包所需的一切在构建主机上都可用并可用。否则,浪费(编译)时间(比如说2个小时)并不好,然后得到一个错误,说明找不到某个头文件/库/可执行文件。所以,在CMake运行时,你最好确定你需要的一切都在这里。为此,CMake有很多工具。

考虑一下你的特殊情况:你需要找到Python库,否则构建是不可能的。要做到这一点,你应该使用find_package这样的:

find_package(PythonLibs REQUIRED) 

看看到documentation,并提供其他选项(如版本),如果你需要。你的不应该在你的CMakeLists.txt中使用硬编码路径,否则你的项目将不是真正的可移植的(并且很可能你将是唯一能够构建它而没有许多问题的人)。相反,Python libs finder模块将提供稍后需要使用的变量,如果没有找到,则会失败w/error。

如果CMake以无错误结束,您可以使用找到的Python库。首先你需要更新#include路径:

include_directories(${PYTHON_INCLUDE_DIRS}) 

然后告诉你的可执行projectname需要链接瓦特/ Python的库链接:

add_executable(projectname ${SOURCE_FILES}) 
target_link_libraries(projectname ${PYTHON_LIBRARIES}) 

再次,尽量避免修改CMAKE_CXX_FLAGS (和其他人) - 有大量的电话要做全球和/或每个目标。其中一些是:

+0

这工作,谢谢!一个小修改,对于find_packages,该标志应该是“需要”而不是“需要”。 –