【问题标题】:Trying to Compile 64-bit DLL with mingw-w64尝试使用 mingw-w64 编译 64 位 DLL
【发布时间】:2015-05-26 12:16:08
【问题描述】:

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

【问题讨论】:

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

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


【解决方案1】:

确保调用 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 或类似的东西。

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多