CMake python链接问题
我昨天开始与CMake合作,所以还是非常非常的新手。我试图在c中嵌入一些python,更确切地说,我想从我的c程序中调用python脚本。我一直在网上寻找一些资源,在这篇文章之后,我得到了最好的结果 至于嵌入python代码,我的实现几乎是1:1的 在myCMakeLists.txt中,我有CMake python链接问题,python,c,cmake,Python,C,Cmake,我昨天开始与CMake合作,所以还是非常非常的新手。我试图在c中嵌入一些python,更确切地说,我想从我的c程序中调用python脚本。我一直在网上寻找一些资源,在这篇文章之后,我得到了最好的结果 至于嵌入python代码,我的实现几乎是1:1的 在myCMakeLists.txt中,我有 find_package(PythonLibs REQUIRED) include_directories(${PYTHON_INCLUDE_DIRS}) add_library(TARS
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
add_library(TARS SHARED ${SOURCES})
target_link_libraries(TARS ${PYTHON_LIBRARIES})
它构建了libTARS,但给了我一个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\u 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”的未定义引用
经过一些修改后,我发现python的默认3.5版本缺少这些函数,而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")
将以下内容添加到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})
因此,如果您需要一个可执行文件,就强制使用Python2.7,显然,将'add_library(TARS SHARED${SOURCES})`替换为'add_executable(TARS${SOURCES})`。如果这给了您未定义的引用,请发布错误消息。我相信现在是python版本的错误@arrowd。谢谢你的回复!这违背了
find_package
的目的。正确的方法是在调用find\u-package
之前设置(Python\u附加版本2.7)。请看,这看起来确实像一个更干净的soloution@arrowd,尽管如果我改用它,我仍然会收到错误:\n虽然现在只有一个而不是三个,`PyString\u FromString'仍然是未定义的关于--ldflags
?