【发布时间】:2017-10-27 08:33:56
【问题描述】:
我昨天开始使用 CMake,所以还是非常非常新手。我正在尝试在 c 中嵌入一些 python,更准确地说,我想从我的 c 程序中调用 python 脚本。我一直在网上寻找一些资源,并且在这篇帖子CMake not linking Python 之后我得到了最好的结果。
至于嵌入我的 python 代码,我的实现几乎是 this python documentation example, section 5.3 的 1:1。
在我的 CMakeLists.txt 我有
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
add_library(TARS SHARED ${SOURCES})
target_link_libraries(TARS ${PYTHON_LIBRARIES})
它构建但给了我一个结果 libTARS.so。我的问题是我需要它成为可执行文件,但我不知道该怎么做。我玩过类似于
的东西 find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
add_library(TARS SHARED ${SOURCES})
target_link_libraries(TARS ${PYTHON_LIBRARIES})
add_executable(TARSEXEC ${SOURCES})
target_link_libraries(TARSEXEC TARS)
这给了我一些对一些 python 包装函数的未定义引用的错误。就像我说的,CMake 超级新手,所以我可能会犯一些非常明显和愚蠢的错误。任何朝着正确方向的帮助或轻推将不胜感激。
干杯
更新:
我已经进行了以下 CMake 配置
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
add_executable(TARS ${SOURCES})
target_link_libraries(TARS ${PYTHON_LIBRARIES})
它给了我以下错误
/home/alxhoff/git/siemens/siemens-personal/TARS/src/main.c:101: 对 `PyString_FromString' 的未定义引用
/home/alxhoff/git/siemens/siemens-personal/TARS/src/main.c:139: 对“PyInt_AsLong”的未定义引用
/home/alxhoff/git/siemens/siemens-personal/TARS/src/main.c:160: 对“Py_Finalizer”的未定义引用
经过一番 grepping,我发现默认的 3.5 版本的 python 缺少这些功能,而 2.7 包含它们。我现在只需要强制 CMake 使用 2.7。
使用以下方法解决
set(PYTHON_EXECUTABLE "/usr/bin/python2.7")
set(PYTHON_INCLUDE_DIR "/usr/include/python2.7")
set(PYTHON_LIBRARIES "/usr/lib/x86_64-linux-gnu/libpython2.7.so")
【问题讨论】:
-
如果你需要一个可执行文件,显然将`add_library(TARS SHARED ${SOURCES})`替换为`add_executable(TARS ${SOURCES})`。如果这给了您未定义的引用,请发布错误消息。
-
我现在相信这是一个python版本错误@arrowd。感谢您的回复!