我有一个MinGW64编译的DLL(python模块),它在加载时会出错:
ImportError: DLL load failed: Invalid access to memory location
DLL仅链接到64位库(Dependency Walker确认)并具有调试符号。代码是相当复杂的c ++ 11(大约30个源文件),我不能将它平分。我已经用MinGW64成功编译和测试了其他模块,工具链工作正常。
网络上的一些人报告了使用SSE2指令的代码的错误(我的hw支持那些,我没有明确地使用它们)或者从尚未初始化的全局变量中读取(有一些函数)使用__attribute__((constructor))
,但那些应该在MinGW64中工作就好了,根据我读过的内容; 更新:我删除了所有构造函数以确保它不是原因 - 它没有差)。
分析错误来自何处的方法是什么?
当我在调试器中加载DLL时(使用ctypes.WinDLL(...)
),遗憾的是,我从gdb只获得了无意义的堆栈跟踪 - 显然,错误被ntdll.dll
捕获并且信号被提升,但它没有给出关于错误来自何处的任何进一步提示:
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16 ()
from C:\Windows\system32\ntdll.dll
(gdb) warning: HEAP[python.exe]:
warning: Invalid address specified to RtlSizeHeap( 00000000003B0000, 0000000002306830 )
(gdb) bt
#0 0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16 ()
from C:\Windows\system32\ntdll.dll
#1 0x0000000077c0c241 in ntdll!RtlZeroHeap ()
from C:\Windows\system32\ntdll.dll
#2 0x0000000077c0c250 in ntdll!RtlZeroHeap ()
from C:\Windows\system32\ntdll.dll
#3 0x0000000077c3c130 in ntdll!LdrLoadAlternateResourceModuleEx ()
from C:\Windows\system32\ntdll.dll
#4 0x00000000003b0000 in ?? ()
#5 0x0000000002306830 in ?? ()
#6 0x00000000003b0000 in ?? ()
#7 0x00000000792e21c0 in ?? ()
#8 0x00000000003b0000 in ?? ()
#9 0x0000000077c3c0ba in ntdll!LdrLoadAlternateResourceModuleEx ()
from C:\Windows\system32\ntdll.dll
#10 0xffffffffffffffff in ?? ()
#11 0x0000000050000061 in ?? ()
#12 0x0000000000000000 in ?? ()
我还将目标文件与“hello world”可执行文件链接起来,但是当用Reading symbols from woomain.exe
打开文件时,gdb已经崩溃了(这是我的可执行文件):
答案 0 :(得分:6)
问题是python在编译模块时链接到与minGW不同的msvcrt - 它在http://bugs.python.org/issue16472报告。
答案 1 :(得分:0)
嗯,这可能不适合你,只是一个提示。 ImportError: DLL load failed: Invalid access to memory location.
我在尝试使用C语言编写自己的Python扩展时遇到了同样的错误:平台:Windows 32位。
这是一个真正的痛苦,因为在所有Python环境(Spyder,Notebook,普通控制台......)中,此错误在交互式和非交互式模式中随机出现。我使用MinGW和Python的distutils(命令python setup.py install
)编译了我的代码。编译没有发出警告或错误,并将pyd文件生成到正确的目录中。但是当试图导入这个模块import example
时,我的Python代码不规则地崩溃了(通常只有五分之一的尝试导入模块成功)。
奇怪的是,在另一台计算机上它工作得很好......好吧,我终于找到了一个解决方法 - 我下载了一个较新版本的MinGW(在我使用Qt SDK发行版中包含的版本之前)并编译了模块再次。然后它没有更多的崩溃工作。但是我没有找到任何系统的解决方案或解释。所以我可能与编译器有关(可能没有它的DLL?我不确切知道)用于生成pyd文件。
答案 2 :(得分:0)
我在导入win32api时遇到同样的错误,我只是在导入win32api之前导入了ctypes并且错误不存在。
答案 3 :(得分:0)
对我来说,我在opencv2上遇到这样的错误:
from .cv2 import *
ImportError: DLL load failed: Invalid access to memory location.
解决方案: 为此,我只是卸载了opencv模块,然后再次将其重新安装。
卸载:
pip uninstall opencv-python
安装:
pip install opencv-python
现在它对我有用。