我一直在尝试使用mingw-w64编译64位版本的Ada dll,以便在C ++程序中使用。
它似乎正在工作,因为它编译时没有错误并将加载到64位程序中,我可以使用GetProcAddress获取接口函数的地址。
但是,在尝试调用这些函数时,它们会在具有访问冲突错误的异常位置中断。看一下这些指针,看起来它们都是0x00000000 ########,这意味着它们都没有通常的32位寻址集之外的任何位。
查看gnatbind生成的广告文件,我也发现:
type Version_32 is mod 2 ** 32;
u00001 : constant Version_32 := 16#65712768#;
这似乎表明,即使它以64位编译dll的部分内容(足以欺骗编译器和程序,使其相信dll足以加载64位),底层实现仍然是32位。我猜这是导致访问冲突错误的原因,当程序期待64位寻址时访问32位内存地址。
如何让mingw-w64实际编译并正确绑定64位的dll?
答案 0 :(得分:0)
确保您调用DLL adainit和adafinal。否则您需要使用gnatbind -a密钥。在GPR中它看起来像:
package Binder is
for Default_Switches ("Ada") use
("-a"); -- call adainit from DllMain
end Binder;
尝试使用MSYS2中的MinGW64。 Some people state that it's best free toolchain for Win64。 TDM-GCC没有动态构建libgnarl或类似的东西。