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

Python C API引入iostream导致DLL加载失败问题求助

Python C API导入错误:包含时DLL加载失败

我从网上找了个简单的Python C API示例,移除#include <iostream>可以正常导入Python,但保留这个头文件时,导入fib.pyd就报错:ImportError: DLL load failed while importing fib: 找不到指定的模块。。用的是Python 3.10,已经确认不是fib.pyd找不到或者PyInit_fib的问题。

示例代码

#include <Python.h>
#include <iostream>
int _fib(int n)
{
     //unimportant implementation details
     return 0;
}
static PyObject* fib(PyObject* self, PyObject* args)
{
    int n;
    return Py_BuildValue("i", _fib(n));
}
static PyMethodDef FibMethods[] = {
    {"fib", fib, METH_VARARGS, "Calculate the Fibonacci numbers (in C)."},
    {NULL, NULL, 0, NULL}  /* Sentinel */
};
static struct PyModuleDef ticlib={
    PyModuleDef_HEAD_INIT,
    "fib",
    "A fast tic tac toe implementation",
    -1,
    FibMethods,
    NULL,
    NULL,
    NULL,
    NULL

};

PyMODINIT_FUNC
PyInit_fib(void)
{
    using namespace std;
    return PyModule_Create(&ticlib);
}

依赖项对比

包含的异常版本(fib.dll依赖)

$ ldd fib.dll
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb9f9d0000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffb9f1f0000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffb9d1c0000)
        msvcrt.dll => /cygdrive/c/WINDOWS/System32/msvcrt.dll (0x7ffb9ed00000)
        libstdc++-6.dll => /cygdrive/c/Program Files (x86)/GtkSharp/2.12/bin/libstdc++-6.dll (0x6fc40000)
        python310.dll => /cygdrive/e/Python/Python310/python310.dll (0x7ffb2e400000)
        WS2_32.dll => /cygdrive/c/WINDOWS/System32/WS2_32.dll (0x7ffb9f0f0000)
        VERSION.dll => /cygdrive/c/WINDOWS/SYSTEM32/VERSION.dll (0x7ffb95e30000)
        RPCRT4.dll => /cygdrive/c/WINDOWS/System32/RPCRT4.dll (0x7ffb9f800000)
        libstdc++-6.dll => /cygdrive/e/msys64/mingw64/bin/libstdc++-6.dll (0x7ffb2de10000)
        ADVAPI32.dll => /cygdrive/c/WINDOWS/System32/ADVAPI32.dll (0x7ffb9db40000)
        sechost.dll => /cygdrive/c/WINDOWS/System32/sechost.dll (0x7ffb9f040000)
        ucrtbase.dll => /cygdrive/c/WINDOWS/System32/ucrtbase.dll (0x7ffb9d550000)
        VCRUNTIME140.dll => /cygdrive/c/WINDOWS/SYSTEM32/VCRUNTIME140.dll (0x7ffb84c50000)
        libgcc_s_seh-1.dll => /cygdrive/e/msys64/mingw64/bin/libgcc_s_seh-1.dll (0x7ffb98030000)
        libwinpthread-1.dll => /cygdrive/e/msys64/mingw64/bin/libwinpthread-1.dll (0x7ffb93370000)

不包含的正常版本(fib.dll依赖)

$ ldd fib.dll
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb9f9d0000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffb9f1f0000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffb9d1c0000)
        msvcrt.dll => /cygdrive/c/WINDOWS/System32/msvcrt.dll (0x7ffb9ed00000)
        python310.dll => /cygdrive/e/Python/Python310/python310.dll (0x7ffb2e400000)
        WS2_32.dll => /cygdrive/c/WINDOWS/System32/WS2_32.dll (0x7ffb9f0f0000)
        RPCRT4.dll => /cygdrive/c/WINDOWS/System32/RPCRT4.dll (0x7ffb9f800000)
        VERSION.dll => /cygdrive/c/WINDOWS/SYSTEM32/VERSION.dll (0x7ffb95e30000)
        ADVAPI32.dll => /cygdrive/c/WINDOWS/System32/ADVAPI32.dll (0x7ffb9db40000)
        sechost.dll => /cygdrive/c/WINDOWS/System32/sechost.dll (0x7ffb9f040000)
        ucrtbase.dll => /cygdrive/c/WINDOWS/System32/ucrtbase.dll (0x7ffb9d550000)
        VCRUNTIME140.dll => /cygdrive/c/WINDOWS/SYSTEM32/VCRUNTIME140.dll (0x7ffb84c50000)

问题原因与解决办法

从依赖对比可以看出,包含<iostream>的版本额外依赖MinGW的几个动态库:libstdc++-6.dll、libgcc_s_seh-1.dll、libwinpthread-1.dll,而且出现了两个不同路径的libstdc++-6.dll,可能存在版本冲突,导致Python找不到正确的依赖库。

解决方法:

  • 添加环境变量:把MinGW的bin目录(比如示例中的E:\msys64\mingw64\bin)添加到系统PATH环境变量中,确保Python能找到这些依赖库
  • 静态链接编译:编译时添加-static-libgcc -static-libstdc++ -static参数,把依赖库打包到fib.pyd中,避免动态依赖问题
  • 移除不必要的头文件:代码中并未实际使用<iostream>的功能,直接删掉#include <iostream>和using namespace std;,彻底避免依赖问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:07:29