在C++中嵌入Python时遭遇cpython/pyatomic_gcc.h文件缺失的编译错误
我正在尝试在C++里调用Python,但导入Python头文件时遇到了编译错误——明明cpython/pyatomic_gcc.h文件就在对应的目录里,编译器却一直提示找不到它!
错误信息:
cmd /c chcp 65001>nul && C:\msys64\ucrt64\bin\g++.exe -fdiagnostics-color=always -g C:\Users\21211433\Desktop\Code\C++\First\src\python.c -o C:\Users\21211433\Desktop\Code\C++\First\src\python.exe In file included from C:/Users/21211433/AppData/Local/Programs/Python/Python313/include/pyatomic.h:9, from C:/Users/21211433/AppData/Local/Programs/Python/Python313/include/Python.h:70, from C:\Users\21211433\Desktop\Code\C++\First\src\python.c:2: C:/Users/21211433/AppData/Local/Programs/Python/Python313/include/cpython/pyatomic.h:532:12: fatal error: cpython/pyatomic_gcc.h: No such file or directory 532 | # include "cpython/pyatomic_gcc.h" | ^~~~~~~~~~~~~~~~~~~~~~~~
我的代码(Python.cpp):
#define PY_SSIZE_T_CLEAN #include <C:/Users/21211433/AppData/Local/Programs/Python/Python313/include/Python.h> int main() { return 0; }
我确认过pyatomic_gcc.h确实在C:/Users/21211433/AppData/Local/Programs/Python/Python313/include/cpython/目录下,但编译器就是识别不到它。
可能的解决办法
我给你梳理几个大概率能解决问题的步骤,你可以逐一尝试:
1. 修正编译命令的头文件搜索路径
你现在直接在代码里硬编码了Python.h的绝对路径,但编译器不知道要去Python的include根目录下找嵌套的子目录文件(比如cpython里的内容)。正确的做法是在编译命令中用-I参数指定Python的include目录,同时简化代码里的include语句:
编译命令改成这样:g++ -g -IC:/Users/21211433/AppData/Local/Programs/Python/Python313/include C:\Users\21211433\Desktop\Code\C++\First\src\python.c -o C:\Users\21211433\Desktop\Code\C++\First\src\python.exe -LC:/Users/21211433/AppData/Local/Programs/Python/Python313/libs -lpython313代码里的include改成相对路径形式:
#define PY_SSIZE_T_CLEAN #include <Python.h>这样编译器会从你指定的根目录开始搜索,嵌套的
cpython/pyatomic_gcc.h自然就能被找到。2. 检查架构兼容性
确保你用的Python版本和MSYS2的g编译器架构匹配——比如g是64位的,Python也必须是64位安装包,32位和64位混用很容易出现这类路径/文件识别问题。3. 验证头文件包含逻辑
错误里的#include "cpython/pyatomic_gcc.h"是相对路径包含,编译器会优先从当前头文件所在的目录(也就是pyatomic.h所在的cpython目录)找,但如果编译时没指定Python的include根目录,编译器的搜索上下文就不对,自然找不到。所以一定要通过-I参数把Python的include根目录加入搜索路径。
备注:内容来源于stack exchange,提问作者LEBG

