尝试使用mingw-w64编译64位DLL

时间:2015-03-23 13:24:13

标签: dll compilation 64-bit ada mingw-w64

我一直在尝试使用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?

1 个答案:

答案 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或类似的东西。