1

我想在 Windows 上使用 SWIG 来构建 64 位应用程序。我有一个类,其中有一个指向缓冲区的指针,并且因为我想与 .NET 类交互,所以指针被声明为intptr_t.

问题是标准 SWIGstdint.i假设intptr_tint(在 32 位环境中)或long(在 64 位环境中)。虽然这在 Unix 上是正确的,但在 Windows 上却是错误的。有没有人有类似的经验或任何想法如何为此创建解决方法?

我已经设置了intptr_t=>IntPtr转换所需的类型映射,它在 32 位环境中运行良好,但它在 64 位环境中截断了指针。

4

1 回答 1

0

好的,我会回答我自己的问题。这似乎是 Windows 上 SWIG 中的一个错误,它被视为longint6464 位 Windows 上,而实际上它是一个int32. 在此处查看有关此主题的更多信息: 64 位 Windows 上 long 的位大小是多少?

SWIG 的另一个问题是它区分了 32 位和 64 位代码,但我使用的原因intptr_t是为了避免位数问题,因为根据定义,它提供了一个足够大的整数来容纳一个指针。

所以我最后所做的是编写一个脚本,在生成包装器后运行该脚本来修复类型签名从intto intptr_t。虽然这并不优雅,但出于 Python 和 PHP 包装器的其他原因,我已经不得不这样做了。

于 2012-03-20T10:33:07.223 回答