使用 SWIG 时遇到 “Assertion Failed”——问题原因与解决方法
问题
近日在 Windows(64 bit) 上使用 swig 时总是遇到“Assertion Failed”。不仅是我,另一位用户也遇到了同样的麻烦。
追踪报错来源发现,swig 在函数 realloc
失败之后直接以“断言”的形式处理失败,这才造成了“Assertion Failed”。
究其根源,从官网上下载的 swig.exe 是 32 位的,而在 64 位操作系统上,一个 32 位 exe 能处理的内存有上限——通常不超过 2Gb。当工程规模扩大之后,swig 生成的 C++ 代码可能超过上百万行,在此期间需要占用大量内存,要求太多内存会导致函数 realloc
失败。
解决
swig 的维护人员已经开始处理内存的问题,相信在新版本可以得到解决。
此外,还有一个“土”办法——用 swig 的源代码重新编译一个 64 位的 exe 替换掉官网发布的文件。