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
相关产品推荐
相关产品推荐

