我一直在尝试使用 mingw-w64 编译 64 位版本的 Ada dll 以用于 C++ 程序。
它似乎正在工作,因为它编译没有错误,并将加载到 64 位程序中,我可以使用 GetProcAddress 获取接口(interface)函数的地址。
但是,当尝试调用这些函数时,它们会在不寻常的地方出现访问冲突错误。查看指针,看起来它们都是 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 正确编译和绑定(bind) 64 位 dll?
最佳答案
确保调用 DLL adainit 和 adafinal。否则你需要使用 gnatbind -a key 。在 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 或类似的东西。
关于dll - 尝试使用 mingw-w64 编译 64 位 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211404/