You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.11编写C++扩展遇ImportError:未定义PyInit_MyMath导出函数

解决Python C++扩展导入时的"dynamic module does not define module export function"错误

问题根源在于模块初始化函数名与setup.py中定义的模块名大小写不匹配:

  • 你在setup.py里指定的模块名是MyMath(首字母大写)
  • 但C++代码里的初始化函数是PyInit_mymath(全小写)
    Python 3要求扩展模块的初始化函数必须严格遵循PyInit_<模块名>的命名规则,且大小写完全一致,否则Python无法识别到导出函数。

两种解决方法:

方法1:修改C++代码,匹配setup.py的模块名

修改add.cpp中的模块定义和初始化函数名,与MyMath保持一致:

// 修改模块定义中的名称
static struct PyModuleDef mymath = {
    PyModuleDef_HEAD_INIT,
    "MyMath",  // 改为和setup.py一致的模块名
    NULL,
    -1,
    MathModuleMethods
};

// 修改初始化函数名
PyMODINIT_FUNC PyInit_MyMath(void) {
    return PyModule_Create(&mymath);
}

方法2:修改setup.py,匹配C++代码的命名(更推荐,符合Python模块命名规范)

Python模块名通常使用小写,将setup.py中的模块名改为mymath:

from setuptools import setup,Extension

mm = 'mymath'  # 改为小写
setup(name=mm,ext_modules=[Extension(mm,sources=['add.cpp'])])

之后导入模块时使用import mymath即可。

后续操作:

  1. 清理旧的编译文件:执行python setup.py clean
  2. 重新编译安装:执行python setup.py develop
  3. 确认生成的.so文件名与模块名一致(比如mymath.cpython-311-x86_64-linux-gnu.so)

内容的提问来源于stack exchange,提问作者shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:21:20