我想在Windows上使用SWIG来构建64位应用程序。我有一个类,它有一个指针到缓冲区,因为我想与.NET类接口,指针被声明为intptr_t
。
问题在于标准SWIG stdint.i
假定intptr_t
是int
(在32位环境下)或long
(在64位环境中)。虽然在Unix上也是如此,但在Windows上却是错误的。有没有人有类似的经验或任何想法如何为此创建一个解决方法?
我已经设置了intptr_t
=>所需的文字地图IntPtr
转换,它在32位环境中工作正常,但它在64位环境中截断指针。
答案 0 :(得分:0)
好的,我会回答我自己的问题。似乎这是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包装器的其他原因,我必须这样做。