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

4
我一直在尝试使用mingw-w64编译一个Ada dll的64位版本,以便在C++程序中使用。看起来它可以工作,因为它能够编译而且不会出现错误,并且可以加载到64位程序中,我可以使用GetProcAddress获取接口函数的地址。然而,当尝试调用这些函数时,它们会在异常位置中断并显示访问冲突错误。查看指针时,发现它们都是0x00000000########,这意味着它们没有超出通常的32位寻址范围之外的任何位。查看由gnatbind生成的ads文件时,我也发现:
  type Version_32 is mod 2 ** 32;
   u00001 : constant Version_32 := 16#65712768#;

在我看来,这似乎表明尽管它正在编译dll的某些部分为64位(足以欺骗编译器和程序认为dll已经足够64位以加载它),但基础实现仍然是32位。我猜这就是导致访问冲突错误的原因,即当程序期望64位寻址时,访问32位内存地址。

我该如何使mingw-w64真正地将dll编译并绑定为64位?


2
我在mingw-w64中成功构建和使用DLL没有问题,所以也许是您正在编译的代码有问题(例如,代码始终包含非可移植结构,如将指针转换为“int”,但该问题直到尝试64位构建才会出现)。看起来您需要进行一些调试工作,但要在这里获得帮助,您需要尝试生成一个MCVE,以显示问题。 - M.M
所以,只是为了澄清而已:当您编译64位dll时,您的bind生成的.ads文件是否包含类似的代码?还是您的代码显示类似于“Version_64 is mod 2 ** 64”?同事在调试时认为问题可能出在Interfaces.C.Strings中,因为他通过剪切一些代码成功运行了一个版本。 - Bryan O'Malley
1个回答

1

确保您调用DLL adainit和adafinal。否则,您需要使用gnatbind -a键。在GPR中,它看起来像:

   package Binder is
      for Default_Switches ("Ada") use
        ("-a");         -- call adainit from DllMain
   end Binder;

尝试使用来自MSYS2的MinGW64。有些人声称它是Win64最好的免费工具链链接1。TDM-GCC没有动态构建libgnarl或类似的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接