很久以前,我用 C++ 编写了一个非常粗糙和原始的 shell,而且我最近才发现 asm.js,所以我认为尝试在浏览器中编译并运行它会很不错,但我不能,因为apt 软件包不兼容。我安装了 llvm、clang 和 emscripten 软件包,它们都与存储库中的内容保持同步。这是我的测试文件hello.c
:
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
这可以编译并运行得很好clang hello.c && ./a.out
,但是当我运行时emcc hello.c
出现错误
/usr/bin/lli: error creating EE: No available targets are compatible with this triple, see -version for the available targets. FAIL: Running the generated program failed!
哪个做generate a.out.js
,但它只包含对 SourceMap 的第一行引用a.out.js.map
(映射本身只包含行:{"version":3,"file":"a.out.js","sources":[],"names":[],"mappings":""}
。现在我认为这意味着 llvm 不是用 编译的-targets=all
,或者至少没有js
目标,所以我尝试构建它我从源代码中获取了最新的软件包,并严格遵循概述的步骤。这里和这里,并且两个包均已成功构建。然而,当像这样运行时,emiscript 抱怨它“期望 3.4”,但得到“(tags/RELEASE_380/final)”版本信息,随后失败。为了安全起见,在开始源代码构建之前我已经 apt-purged emscripten、llvm 和 clang,我希望 3.4 是最低限度版本,而不是仅支持版本,因为我相信最新版本是 3.9,并且文档没有说要考虑任何特殊考虑。无论如何,我尝试从源代码构建 3.4,但显然它无法将“js”识别为有效目标(我尝试在没有该目标的情况下构建并运行它:没有骰子)。对我来说很奇怪的是emscripten
apt-package 没有引入正确编译的 clang/llvm 作为依赖项,所以我可能调用错误了?文档说我应该能够做我正在做的事情,但我是 clang/emscripten 的新手,所以也许我必须首先设置 clang 环境,或者显式链接某些东西?
系统信息
clang/clang++ 版本和信息(来自clang --version
):
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: i686-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
llvm版本和信息(来自lli --version
):
LLVM version 3.8.0
Optimized build.
Built Jul 9 2016 (11:22:59).
Default target: i686-pc-linux-gnu
Host CPU: broadwell
emscripten 版本(来自emcc --version
):1.22.1
最近生成的内容~/.emscripten_sanity
:1.22.1|le32-unknown-nacl|/usr/bin|(tags/RELEASE_380/final)
内核信息(来自uname -srpmio
):Linux 4.4.0-21-generic i686 i686 i686 GNU/Linux
系统是一个安装了扩展的 VirtualBox VM,运行 Linux Mint 18“Sarah”Cinnamon 作为 32 位机器,具有 2 个 CPU 内核、4GB RAM、512mb 视频内存和 ~50GB 虚拟磁盘映像。不存在其他操作系统,基本上是普通安装。目前 apt 存储库提供了 clang、llvm 和 emscripten 的默认版本。