extern "C"函数中使用std::vector及Python调用C++ DLL报错解决
解决MinGW编译C++ DLL被Python ctypes调用时的依赖问题
1. 静态链接C++标准库
MinGW默认动态链接GCC的C++运行时库(如libstdc++-6.dll),若该库不在Python的搜索路径内就会触发依赖错误。编译时添加静态链接参数,将标准库打包进DLL:
g++ -shared -o add.dll add.cpp -static-libstdc++ -static-libgcc
2. 检查DLL依赖项
用工具确认DLL的依赖库是否都能被找到:
- MinGW环境下执行:
objdump -x add.dll | grep DLL - Windows SDK环境下执行:
dumpbin /dependents add.dll
若存在未解决的依赖,要么静态链接对应库,要么将依赖DLL放到Python脚本同目录,或添加到系统PATH中。
3. 验证导出符号正确性
确保extern "C"修饰的函数已正确导出,用nm工具检查:
nm -D add.dll | grep add
正常应显示类似T add(64位)或T _add(32位)的符号,保证Python能定位到函数。
4. 匹配Python与DLL的位数
Python的32/64位版本必须和MinGW编译的DLL位数一致:
- 若Python是64位,直接用MinGW-W64 64位版本编译即可
- 若Python是32位,编译时加
-m32参数:
g++ -shared -m32 -o add.dll add.cpp -static-libstdc++ -static-libgcc
5. 临时添加MinGW路径到系统环境(备选)
若不想静态链接,可在Python脚本开头临时将MinGW的bin目录加入PATH:
import os os.environ['PATH'] = r'C:\mingw64\bin;' + os.environ['PATH'] import ctypes
内容的提问来源于stack exchange,提问作者wangye
相关产品推荐
相关产品推荐

