因为有在C++里面调用Python脚本的需要,所以对该问题进行学习,过程中遇到两个问题记录一下,方便大家有同样问题时能够及时解决,而不至于像我一样捣腾了一整天(哭)。
进入正题:
首先是按照一篇帖子里面的方法写了一个.cpp文件:
#include <Python.h> //C++调用Python需要引入该头文件
int main(int argc, char *argv[])
{
// 初始化python解释器.C/C++中调用Python之前必须先初始化解释器
Py_Initialize();
// 执行一个简单的执行python脚本命令
PyRun_SimpleString("print('hello world')\n");
// 撤销Py_Initialize()和随后使用Python/C API函数进行的所有初始化——即清空Python资源
Py_Finalize();
return 0;
}
代码中每一行的作用均有注释。
然后开始cmake编译,出现以下两个报错:
报错一:fatal error: Python.h: 没有那个文件或目录
错误原因:没有找到Python.h头文件
解决方法:在CMakeLists.txt文件中添加Python.h头文件所在目录
具体为在CMakeLists.txt中添加如下行:
include_directories( /home/li/anaconda3/envs/yolov5/include/python3.8 )
分析:我是用anaconda管理环境的所以我的Python.h头文件会在anaconda文件夹的路径下,大家可以根据自己Python.h文件实际所在路径进行修改。
评价:添加后无报错fatal error: Python.h:没有那个文件或目录,报错解决。
在解决上述问题后,编译时出现了新的报错:
报错二:undefined reference to `Py_SetPythonHome'
错误原因:没有链接到Python动态库,导致找不到对应库函数
解决方法:在CMakeLists.txt文件中链接Python动态库
具体为在CMakeLists.txt中添加如下行:
target_link_libraries( <工程名>
/home/li/anaconda3/envs/yolov5/lib/libpython3.8.so )
分析:libpython3.8.so中包含了这个Python项目的所有动态库,我们需要把它链接到我们的工程里面,Python脚本才可以正常运行。
评价:添加后运行编译正常,生成可执行文件,运行得到正确结果。
完整的CMakeLists.txt如下:
cmake_minimum_required( VERSION 2.8 )
project( expand )
set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
include_directories( /home/li/anaconda3/envs/yolov5/include/python3.8 )
add_executable( expand expand.cpp )
target_link_libraries( expand
/home/li/anaconda3/envs/yolov5/lib/libpython3.8.so )
Hope it helps !
更多推荐
关于在C++里面调用Python(已成功解决)
发布评论