概要
一个m2 mac中实现的C++ 调用Python的例程,部分代码来源于北小菜 的讲解例程。自己解决了一些项目中存在的问题,并且写CMake文件用于跨平台编译。
我的系统环境:MacBook Air, Apple M2 chip, macOS Sonoma14.2.1
代码仓库和代码运行流程
代码放在GitHub: https://github.com/KaiwenYu2001/Cpp-call-Python-Demo
获取自己系统里的python-dev头文件和动态库
- 在我的"/CallFunc/CMakeLists.txt"中有这样一段话:它的功能是在你的系统环境里查找相应python版本的安装目录。我这里用了pyhton3.10,你们可以尝试不同的版本。
find_package(Python3 3.10 COMPONENTS Interpreter Development REQUIRED) if (Python3_FOUND) message("Python include directory: " ${Python3_INCLUDE_DIRS}) message("Python version is: " ${Python3_VERSION}) message(${Python3_LIBRARIES}) endif (Python3_FOUND)
- 完成之后,在项目根目录打开>terminal执行下面命令,cmake会帮你打印出python的安装路径。在系统路径中找到python安装目录后复制“include”和“lib”两个文件夹到我们项目的“pythonLib”并覆盖。
cd CallFunc mkdir source cd source cmake ..
- 我自己电脑里的安装路径在
/opt/homebrew/opt/python@3.12/Frameworks/Python.framework/Versions/3.12/
,仅供参考。 - 在m芯片mac中,python动态库文件的文件名为
libpython3.12.dylib
,在下一步的编译准备工作中需要用到。
编译前准备工作
- 需要修改"/CallFunc/main.cpp"中的
PyRun_SimpleString("sys.path.append())
为自己电脑中python脚本的绝对路径。 - 修改"/CallFunc/CMakeLists.txt"中的
include_directories
为"pythonLib"中引入的头文件的存放目录 - 修改"/CallFunc/CMakeLists.txt"中的
target_link_libraries
为"pythonLib"中引入的python动态链接库的绝对路径(这里试了很多方法,最后只有绝对路径能正常编译运行)
编译运行
- 确保在"/CallFunc/source"打开terminal
看到打印“c++ is the best”即调用成功。cmake .. make ./source/myCpp