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