我尝试按照网络汇编说明(http://webassembly.org/getting-started/developers-guide/)安装emsdk。这一切都在OSX上编译得很好,但是当我尝试在Ubuntu 16.04上构建它时,我遇到了以下错误:
[ 94%] Built target llvm-lto2
[ 94%] Built target llvm-diff
[ 94%] Linking CXX executable ../../bin/llvm-c-test
collect2: error: ld returned 1 exit status
tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/build.make:425: recipe for target 'bin/llvm-c-test' failed
make[2]: *** [bin/llvm-c-test] Error 1
CMakeFiles/Makefile2:15474: recipe for target 'tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/all' failed
make[1]: *** [tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2
Build failed due to exception!
Working directory: /opt/emsdk/clang/fastcomp/build_incoming_64
Command '['make', '-j1']' returned non-zero exit status 2
Installation failed!
有谁知道发生了什么事?
答案 0 :(得分:0)
对我来说,构建emsdk时的主要问题是交换,因为它看起来像安装脚本检测到4个逻辑处理器内核并启动3线程编译。当所有内容都被编译时,几个链接器进程(ld
)似乎同时启动,它们耗尽了我的8 Gb内存(至少当同时运行多个选项卡的Firefox时)。系统变得没有响应,我必须停止使用它并等待或终止ld
个进程之一,然后在我的情况下,其他两个将完成链接,虽然安装将失败,当我重新运行时,有2个更少的二进制文件链接:)。
我试图模拟内存耗尽而不用交换
$ ulimit -v 2000000
$ ./emsdk install sdk-incoming-64bit
并得到了同样的错误collect2: error: ld returned 1 exit status
,但在它之前有/usr/bin/ld: failed to set dynamic section sizes: Memory exhausted
之类的内容。
我完全不确定你是否有这个问题(特别是因为你没有任何Memory exhausted
消息并且你正在执行单线程编译(make -j1
)),但是当内存耗尽时,ld
可能会出现其他故障情况。您可以重新运行安装,同时观察另一个终端上的top
输出,检查可用内存 + buff / cache 是否几乎为0(只是几乎为0的免费内存可能没问题。如果是这样,您可以尝试使用交换分区或文件。不幸的是,您不能使用终止ld
进程之一的技巧,因为您已经只有单线程编译(make -j1
)。