我正在通过CMake构建第三方应用程序,并且我将-DCMAKE_BUILD_TYPE = MinSizeRel传递给CMake以尝试解决此问题,但这无法解决。
在链接时我总是会出错。
/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/../../../../armv7a-hardfloat-linux-gnueabi/bin/ld: fatal error: clientserver: mmap: failed to allocate 791230396 bytes for output file: Cannot allocate memory
PC构建它有1GB的RAM和6GB的SWAP。试图释放那么多物理ram是困难的,那么有没有办法让链接器使用SWAP或限制它使用的内容?
我也转而使用ld.gold只是为了看看它是否有任何好处但仍然没有运气。遗憾的是,添加更多RAM不是一种选择。
答案 0 :(得分:4)
不是理想的解决方案,但是对于ld的帮助手册和几天的一些实验,我发现了解决方案。
我将/ usr / bin / ld重命名为/usr/bin/ld.old(最终是ld.gold的符号链接),然后我创建了一个名为/ usr / bin / ld的shell脚本,它简单地调用/ usr /bin/ld.old并强制通过一些额外的参数。
--no-map-whole-file --no-keep-memory --no-keep-files-mapped
这解决了我的问题,这与32 / 64bit分配无关,而且链接器无法找到足够的空间。是的,上面的选项增加了I / O使用而不是内存,但事实仍然是确实有效。
答案 1 :(得分:0)
您可以将以下LD
标志传递给gcc -o
命令:
-fuse-ld=gold -Wl,--no-map-whole-files -Wl,--no-keep-memory -Wl,--no-keep-files-mapped
理想情况下,这应该可以解决您的内存问题。请注意,如果使用-Wl
命令间接完成链接,则ld
是将标志传递给gcc -o
命令的选项。