Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake python链接问题_Python_C_Cmake - Fatal编程技术网

CMake python链接问题

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

我昨天开始与CMake合作,所以还是非常非常的新手。我试图在c中嵌入一些python,更确切地说,我想从我的c程序中调用python脚本。我一直在网上寻找一些资源,在这篇文章之后,我得到了最好的结果

至于嵌入python代码,我的实现几乎是1:1的

在myCMakeLists.txt中,我有

   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