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

标签 dll compilation 64-bit ada mingw-w64

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

相关文章:

internet-explorer - 无法在 IE 8 中显示来自 HTTPS 的 PDF(在 64 位 Vista 上)

c++ - 将 C++ 应用程序链接到 dll

php - 为什么动态构造对于 php 编译器 (PHP) 来说很困难?

assembly - 可以跳过每个第二个字节的SSE mov指令?

visual-studio-2013 - 如何在 Visual Studio 中将 TypeScript 输出合并到多个文件中

c++ - Linux编译代码失败,Windows编译成功 : Cause/Fix?

database - 我们能否从 64 位客户端连接 32 位 Oracle 服务器,反之亦然?

c# - 为 C# 项目创建 C++ DLL - 未导出函数

iis - Asp.net 将 DLL 重新安装到 GAC 中

dll - 如何使用 Marshal 类编译 C++ DLL