在Windows上编译C++ pybind11扩展时MinGW执行g++命令报错如何处理
报错根因
你遇到的报错核心是Linux Shell的反引号命令替换特性,不被Windows默认的cmd/PowerShell命令行支持:原命令里的`python -m pybind11 --includes`本意是自动执行该命令获取pybind11的头文件路径,但是Windows命令行无法解析该语法,直接把这段内容拆成了单独参数传给g++,才会出现识别不到-m、找不到python/pybind11这类错误。
调整步骤
第一步:手动获取pybind11头文件参数
先在命令行单独执行以下命令,复制所有输出内容:
python -m pybind11 --includes
如果提示找不到python,就替换成你本机Python的完整路径,比如C:\Python310\python.exe -m pybind11 --includes。
输出内容格式类似:-I"C:\Python310\include" -I"C:\Python310\Lib\site-packages\pybind11\include"
第二步:修改编译命令
需要对原命令做4处修改:
- 移除Linux专属的
-fPIC参数,MinGW不需要该选项 - 把原命令里反引号包裹的内容,替换成你上一步复制的头文件参数
- 输出文件后缀从
.so改为.pyd,这是Windows下Python可识别的扩展模块后缀 - 额外添加Python库文件的链接参数,避免链接报错
调整后示例命令
假设你用的是Python3.10,安装路径为C:\Python310\,调整后的命令如下:
g++ -O3 -Wall -shared -std=c++11 -I"C:\Python310\include" -I"C:\Python310\Lib\site-packages\pybind11\include" EO_functions_bipartite.cpp -L"C:\Python310\libs" -lpython310 -o extremal_bi.pyd
注意事项
- MinGW的位数要和Python位数保持一致:32位MinGW对应32位Python,64位MinGW对应64位Python,否则会出现架构不兼容的编译错误
- 如果你的Python路径带空格,所有路径参数必须用英文双引号包裹,避免解析错误
- 如果你使用的是MSYS2的MinGW终端,支持类Unix的命令替换语法,可以直接把原命令的反引号替换为
$(),同时修改输出后缀和移除-fPIC参数即可,不需要手动复制头文件路径
内容的提问来源于stack exchange,提问作者Dario
相关产品推荐
相关产品推荐

