【问题标题】:CMake python linking issuesCMake python链接问题
【发布时间】: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。感谢您的回复!

标签: python c cmake


【解决方案1】:

将以下内容添加到 CMakeLists.txt

   find_package(PythonLibs REQUIRED)

   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")

   include_directories(${PYTHON_INCLUDE_DIRS})
   add_executable(TARS ${SOURCES})
   target_link_libraries(TARS ${PYTHON_LIBRARIES})

从而强制使用python 2.7

【讨论】:

  • 这违背了find_package 的目的。正确的方法是在调用find_package 之前先set(Python_ADDITIONAL_VERSIONS 2.7)。见cmake.org/cmake/help/v3.9/module/FindPythonLibs.html
  • 这似乎是一个更干净的解决方案@arrowd,尽管如果我使用它,我仍然会遇到错误:\ 虽然现在只有一个而不是三个,但 `PyString_FromString' 仍然未定义
  • --ldflags 怎么样?
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多