我在 emscripten 文档中读到 emscripten 默认编译为 asm.js 优化,但是如果我打开编译后的代码,我找不到任何“use asm;”如何得到它?我应该手动添加还是我编译错误?
目前我正在使用“emcc main.c -o out.html”进行编译,也尝试使用-02标志。
这是设计使然。有时它会生成(参见源代码)
"almost asm"
而不是"use asm"
,这会禁用所有asm.js优化。当编译的代码使用浏览器中未实现的某些功能(如此 v8 问题)时,就会发生这种情况。
对于我现在正在从事的项目,我已将 Firefox 的 "almost asm"
替换为 "use asm"
,并保留 Chrome 的原样,因为 "use asm"
在启动时导致严重减速。
因此,仅用
"almost asm"
替换 "use asm"
并不安全,但有时这可以正常工作。您应该在必须支持的所有浏览器版本中仔细测试您的应用程序(但确保您在关闭开发工具的情况下进行测试) - 如果它有效,这意味着您有一个已经实现的幸运案例:继续并替换。
不是最好的解决方案,但我用“use asm”替换了“almost asm”,并且它可以在 Firefox 中使用(已正确编译并且可测量得更快)。
我也寻找了很长时间的解决方案来让 Emscripten 自己做到这一点,但没有找到解决方案。
这应该很简单,但是如果您尝试了许多不同的版本,您可能有来自不同版本的配置文件需要修复。我将其编译为 asm.js 的方法是转到以前的版本,其中默认生成 asm.js (1.38.48 是默认情况下启用 fastcomp 的最后一个版本,这是编译为 asm 所必需的默认为 .js),然后确保所有路径都正确并添加一些编译参数:
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
emsdk install 1.38.48
emsdk activate 1.38.48
source emsdk_env.sh
EMCC_DEBUG=1 emcc -v
注意:我不确定这种方式是否有效,您可能必须从源代码构建。
如果最后一个命令显示:
共享:DEBUG:EMCC_WASM_BACKEND告诉我们使用WebAssembly后端
当你去build时,会出现错误:
共享:关键:WebAssembly 设置为目标,但 LLVM 尚未使用 WebAssembly 后端构建
因此,您需要确保 LLVM 正确指向您的
.emscripten
文件中的上游(.emscripten
中的 emsdk/
文件,而不是 ~/
),并且 emscripten 根目录是正确的:
LLVM_ROOT= 'path/to/emsdk/upstream/fastcomp/bin'
EMSCRIPTEN_ROOT='path/to/emsdk/upstream/emscripten'
EMCC_WASM_BACKEND = 0
如果您仍然收到有关 EMCC_WASM_BACKEND 的错误,表示它仍在使用 WebAssembly,它可能是一个环境变量,您可以使用 python 检查 脚本:
import os
for name, value in os.environ.items():
print("{0}: {1}".format(name, value))
如果值不同,则将其更改为:
export EMCC_WASM_BACKEND=0
export EMSCRIPTEN=/path/to/emsdk/upstream/emscripten
现在运行
EMCC_DEBUG=1 emcc -v
时,它应该说:
共享:DEBUG:EMCC_WASM_BACKEND告诉我们使用asm.js后端
没有错误并构建:
emcc -s WASM=0 --separate-asm -s WASM_BACKEND=0 -o build/asmjs.js main.c
或者你可以根据需要输出build/asmjs.html。