Qt Creator - calloc 因内存大而失败
Posted
技术标签:
【中文标题】Qt Creator - calloc 因内存大而失败【英文标题】:Qt Creator - calloc fails with large memory 【发布时间】:2012-09-27 16:15:29 【问题描述】:我对 Qt Creator 或其组件之一有疑问。
我有一个程序需要大量内存(大约 4 GB),我使用 calloc 来分配它。如果我使用 mingw/gcc(不使用 Qt 框架)编译 C 代码,它可以工作,但如果我在 Qt Creator 中编译它(使用 C++ 将 C 代码嵌入到 Qt 框架中),使用 mingw/gcc 工具链, calloc 返回一个空指针。
我已经搜索并找到了 qt-pro 选项QMAKE_LFLAGS += -Wl,--large-address-aware
,它适用于某些情况(大约 3.5GBytes),但如果我超过 4GBytes,它只适用于使用 gcc 编译的 C 代码,而不适用于 Qt。
使用 Qt Creator 编译时如何使用 calloc 分配所需的内存量?
【问题讨论】:
您使用的是什么平台?它是 64 位还是 32 位?您构建为 64 位还是 32 位应用程序? QT Creator(使用 gcc 32 位)在 Win7 上运行,原始 c 代码(工作正常)是用 cygwins x86_64-w64-mingw32-gcc.exe 编译的(所以我猜也是 32 位) 32 位无法访问那么多内存(每个虚拟地址空间很可能需要 2-3GB)。您需要编译为 64 位并在 64 位上运行。 好的,谢谢,但为什么它可以与 cygwins x86_64-w64-mingw32-gcc.exe 一起使用?我认为那也是 32 位的。 【参考方案1】:所以您的cigwin
工具链为您构建了 64 位应用程序。 64 位应用程序可以分配的可能内存大小为 264 字节,远远超过 4Gb。但是 Qt Creator(如果您从 QtSDK 安装它并且没有手动重新配置它)使用 Qt 的工具链,它构建 32 位应用程序。理论上,您可以通过 32 位应用程序分配 4Gb 的内存,但不要忘记,所有库也将加载到此内存中。实际上,您可以分配大约 3 Gb 的内存,而不是在一个连续的块中。
您有 3 种方法可以解决您的问题:
重新考虑您的算法。不要分配 4Gb 的 RAM、使用更智能的数据结构或使用磁盘缓存等。我相信如果您的问题实际上需要超过 4 GB 的内存来解决,您不会问这个问题。
将 Qt 代码与 C 程序分开。然后,您仍然可以将 64-bit-target-compiler 用于 C 程序,将 32-bit-target-compiler 用于 Qt/C++ 部分。您可以通过任何interprocess communication 机制与您的C 程序进行通信。 (实际上标准输入/输出流通常就足够了)
移至 64 位。我的意思是,对 C 和 C++ 代码都使用 64 位目标编译器。但这并不像人们想象的那么简单。您需要在 64 位模式下重建 Qt。关闭一些模块和一些代码修复(我试过一次)是可能的,但是Windows 64 bit officially not supported。
【讨论】:
谢谢!第一个选项是不可能的,我已经考虑过你的第二个建议,所以我会尝试。很棒的社区顺便说一句,是我的第一个问题;)以上是关于Qt Creator - calloc 因内存大而失败的主要内容,如果未能解决你的问题,请参考以下文章
Qt Creator Valgrind内存分析前端(分析Nginx内存)