如何让emcc工作?

时间:2015-04-17 14:16:18

标签: llvm emscripten

当我尝试使用emcc将C代码编译为Javascript时,我收到以下错误:

emcc tests/hello_world.c 
CRITICAL root: fastcomp in use, but LLVM has not been built with the JavaScript backend as a target, llc reports:
===========================================================================
LLVM (http://llvm.org/):
  LLVM version 3.5.1
  Optimized build with assertions.
  Built Feb 22 2015 (00:08:56).
  Default target: x86_64-apple-darwin13.4.0
  Host CPU: corei7-avx

  Registered Targets:
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64
===========================================================================
CRITICAL root: you can fall back to the older (pre-fastcomp) compiler core, although that is not recommended, see https://github.com/kripken/emscripten/wiki/LLVM-Backend
INFO     root: (Emscripten: Running sanity checks)
CRITICAL root: failing sanity checks due to previous fastcomp failure

如何解决这个问题?如何回退到pre-fast-comp?

4 个答案:

答案 0 :(得分:6)

我在从源手动构建Emscripten时遇到了同样的错误。

Emscripten使用自己的LLVM分支 - Fastcomp; 按照说明here从源代码构建它。然后修改~/.emscripten以使LLVM_ROOT像这样

LLVM_ROOT = os.path.expanduser('/home/yourpath/to/emscripten-fastcomp/build/Release/bin') # directory

(它甚至可以是/home/yourpath/to/emscripten-fastcomp/build/bin

答案 1 :(得分:2)

这看起来像是一个配置错误的Emscripten安装。你安装了SDK吗?看起来emcc发现错误的clang(可能是您已经安装过的,存在于PATH emcc之前的clang而不是which clang的{​​{1}}通常随Emscripten一起提供的版本。

你在哪个操作系统上?

在Linux上检查echo $PATHclang,找出哪个emcc

尝试使用EMMAKEN_COMPILER=/path/to/emscripten-fastcomp/bin emcc test/hello.cc调用emcc,这应该覆盖上面的错误路径。

同时尝试使用-v选项调用{{1}}以获得详细输出。

如果这些都不起作用,请发布这些命令的输出以及有关如何重现问题的信息。

答案 2 :(得分:2)

我在这里参加聚会的时间较晚,但对于有同样问题的其他人来说。

在Windows 10上运行,使用针对VS2015的CMake文件构建的emscripten-fastcomp。 emscripten和emscripten-fastcomp都是从他们的Github存储库中克隆出来的。

文档here已过期或根本不正确。对于初学者,请尝试运行emcc -v,即不带任何要编译的文件。

R:\src\tools\emscripten>emcc -v

哪个可以解决这个问题:

> Welcome to Emscripten!
> 
> This is the first time any of the Emscripten tools has been run.
> 
> A settings file has been copied to ~/.emscripten, at absolute path:
> C:\Users\user/.emscripten
> 
> It contains our best guesses for the important paths, which are:
> 
> LLVM_ROOT       = /usr/bin   
> NODE_JS         = R:\apps\nodejs\node.exe   
> EMSCRIPTEN_ROOT = R:\src\tools\emscripten
> 
> Please edit the file if any of those are incorrect.
> 
> This command will now exit. When you are done editing those paths,
> re-run it.
> 

现在编辑

中的LLVM_ROOT变量

C:\Users\user\.emscripten

这样默认

LLVM_ROOT = os.path.expanduser(os.getenv('LLVM') or '/usr/bin') # directory

更改为此类

LLVM_ROOT = os.path.expanduser(os.getenv('LLVM') or 'R:\\src\\tools\\emscripten-fastcomp\\build\\Debug\\bin') # directory

请注意转义后的反斜杠,标准的单反斜杠\将无效。

现在你应该能够运行测试并获得合理的结果,如

emcc -v tests/hello_world.cpp

然后会出现这样的事情:

> R:\src\tools\emscripten>emcc -v tests/hello_world.cpp
> INFO:root:generating system asset: is_vanilla.txt... (this will be
> cached in "C:\Users\user\.emscripten_cache\is_vanilla.txt" for
> subsequent builds) INFO:root: - ok INFO:root:(Emscripten: Running
> sanity checks) INFO:root:(Emscripten: Running sanity checks) clang
> version 3.9.0 (https://github.com/kripken/emscripten-fastcomp-clang
> 60a7e9a9c22b67309e5b1258d38fadfa481a25d3)
> (https://github.com/kripken/emscripten-fastcomp
> 881bd352731d21c7117ad7e2ece347aacae83965) (emscripten 1.37.0 : 1.37.0)
> Target: asmjs-unknown-emscripten Thread model: posix InstalledDir:
> R:\src\tools\emscripten-fastcomp\build\Debug\bin 
> "R:\\src\\tools\\emscripten-fastcomp\\build\\Debug\\bin\\clang++.exe"
> -cc1 -triple asmjs-unknown-emscripten -emit-llvm-bc -emit-llvm-uselists -disable-free -main-file-name hello_world.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -no-integrated-as -mconstructor-aliases -v -dwarf-column-info -debugger-tuning=gdb -coverage-file "C:\\Users\\user\\AppData\\Local\\Temp\\tmpk4sar7\\hello_world_0.o"
> -nostdsysteminc -nobuiltininc -resource-dir "R:\\src\\tools\\emscripten-fastcomp\\build\\Debug\\bin\\..\\lib\\clang\\3.9.0"
> -D __EMSCRIPTEN_major__=1 -D __EMSCRIPTEN_minor__=37 -D __EMSCRIPTEN_tiny__=0 -D _LIBCPP_ABI_VERSION=2 -Werror=implicit-function-declaration -std=c++03 -fdeprecated-macro -fno-dwarf-directory-asm -fdebug-compilation-dir "R:\\src\\tools\\emscripten" -ferror-limit 19 -fmessage-length 80
> -fobjc-runtime=gnustep -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -nobuiltininc -nostdsysteminc "-isystemR:\\src\\tools\\emscripten\\system\\include\\libcxx"
> "-isystemR:\\src\\tools\\emscripten\\system\\lib\\libcxxabi\\include"
> "-isystemR:\\src\\tools\\emscripten\\system\\include\\compat"
> "-isystemR:\\src\\tools\\emscripten\\system\\include"
> "-isystemR:\\src\\tools\\emscripten\\system\\include\\SSE"
> "-isystemR:\\src\\tools\\emscripten\\system\\include\\libc"
> "-isystemR:\\src\\tools\\emscripten\\system\\lib\\libc\\musl\\arch\\emscripten"
> "-isystemR:\\src\\tools\\emscripten\\system\\local\\include"
> "-isystemR:\\src\\tools\\emscripten\\system\\include\\SDL" -o
> "C:\\Users\\user\\AppData\\Local\\Temp\\tmpk4sar7\\hello_world_0.o" -x
> c++ tests/hello_world.cpp clang -cc1 version 3.9.0 based upon LLVM
> 3.9.0 default target i686-pc-windows-msvc
> #include "..." search starts here:
> #include <...> search starts here:  R:\src\tools\emscripten\system\include\libcxx 
> R:\src\tools\emscripten\system\lib\libcxxabi\include 
> R:\src\tools\emscripten\system\include\compat 
> R:\src\tools\emscripten\system\include 
> R:\src\tools\emscripten\system\include\SSE 
> R:\src\tools\emscripten\system\include\libc 
> R:\src\tools\emscripten\system\lib\libc\musl\arch\emscripten 
> R:\src\tools\emscripten\system\local\include 
> R:\src\tools\emscripten\system\include\SDL End of search list.

希望这可以节省别人节礼日的头发撕裂。祝你好运。

答案 3 :(得分:0)

删除并重新安装emsdk之后,我遇到了同样的问题

解决方案:

  1. 打开一个新终端
  2. 转到emsdk安装目录
  3. 源./emsdk_env.sh

重置环境变量至关重要。