【发布时间】: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