我想在 Windows 上使用 SWIG 来构建 64 位应用程序。我有一个类,其中有一个指向缓冲区的指针,因为我想与 .NET 类交互,所以该指针声明为 intptr_t
。
问题在于标准 SWIG stdint.i
假定 intptr_t
是 int
(在 32 位环境中)或 long
(在 64 位环境中)。虽然这在 Unix 上是正确的,但在 Windows 上却是错误的。有没有人有类似的经验或任何想法如何为此创建解决方法?
我已经设置了 intptr_t
=> IntPtr
转换所需的类型映射,它在 32 位环境中工作正常,但它在 64 位环境中截断了指针.
好的,我会回答我自己的问题。这似乎是 Windows 上 SWIG 中的一个错误,它在 64 位 Windows 上将 long
视为 int64
,而实际上它是一个 int32
。在此处查看有关此主题的更多信息: What is the bit size of long on 64-bit Windows?
SWIG 的另一个问题是它区分 32 位和 64 位代码,但我使用 intptr_t
的原因是为了避免位数问题,因为根据定义它给出了一个足够大的整数来容纳一个指针.
所以我最后所做的是编写一个脚本,在生成包装器后运行,以将类型签名从 int
修复为 intptr_t
。虽然这并不优雅,但出于其他原因,我已经不得不为我的 Python 和 PHP 包装器执行此操作。
我是一名优秀的程序员,十分优秀!