正在尝试使用mingw-w64编译64位DLL 我一直在尝试用一个艾达程序来编译一个64位版本的DLW-DLL,用于C++程序。

正在尝试使用mingw-w64编译64位DLL 我一直在尝试用一个艾达程序来编译一个64位版本的DLW-DLL,用于C++程序。,dll,compilation,64-bit,ada,mingw-w64,Dll,Compilation,64 Bit,Ada,Mingw W64,它似乎正在工作,因为它编译时没有错误,将加载到64位程序中,我可以使用GetProcAddress获取接口函数的地址 但是,当尝试调用这些函数时,它们会在异常的地方中断,并出现访问冲突错误。查看指针,它们看起来都是0x00000000,也就是说,它们都没有超出通常32位寻址集的位 查看gnatbind生成的ads文件,我还发现: type Version_32 is mod 2 ** 32; u00001 : constant Version_32 := 16#65712768#;

它似乎正在工作,因为它编译时没有错误,将加载到64位程序中,我可以使用GetProcAddress获取接口函数的地址

但是,当尝试调用这些函数时,它们会在异常的地方中断,并出现访问冲突错误。查看指针,它们看起来都是0x00000000,也就是说,它们都没有超出通常32位寻址集的位

查看gnatbind生成的ads文件,我还发现:

  type Version_32 is mod 2 ** 32;
   u00001 : constant Version_32 := 16#65712768#;
对我来说,这似乎表明,即使它是以64位编译dll的一部分(足以欺骗编译器和程序相信dll是64位的,足以加载它),底层实现仍然是32位的。我猜这就是导致访问冲突错误的原因,当程序需要64位寻址时访问32位内存地址


如何让mingw-w64以64位正确编译和绑定dll?

确保调用dll adainit和ADAFALINAL。否则你需要用钥匙。在探地雷达中,它看起来像:

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

尝试使用MSYS2中的MinGW64。TDM-GCC没有动态构建libgnarl或类似的东西。

我在mingw-w64中成功构建和使用DLL没有问题,因此您正在编译的代码可能有问题(例如,可能代码始终包含不可移植的构造,例如将指针强制转换到
int
,但问题直到您尝试64位构建时才出现)。看起来您前面有一个调试项目,但要获得帮助,您需要尝试生成一个显示问题的。因此,为了澄清起见:当您编译64位dll时,绑定生成的.ads文件是否包含类似的代码?或者您的文件是否会显示类似于“Version_64是mod 2**64”的代码?在调试时,同事认为问题可能出在Interfaces.C.Strings中,因为他能够通过删除一些代码来运行版本。