Emscripten似乎不使用asm.js

Emscripten seems to not use asm.js

本文关键字:asm js Emscripten      更新时间:2023-09-26

我在emscripten文档中读到emscripten默认编译为asm.js优化,但如果我打开编译后的代码,我找不到任何"使用asm;"如何获得它?我应该手动添加还是编译错误?

目前我正在使用"emccmain.c-o out.html"进行编译,也尝试过使用-02标志。

这是经过设计的。有时它会生成(参见源代码("almost asm"而不是"use asm",这会禁用所有asm.js优化。当编译后的代码使用了一些浏览器中没有实现的功能(如v8版本(时,就会发生这种情况。对于我现在正在进行的项目,我已经用"use asm"替换了Firefox的"almost asm",并对Chrome保持原样,因为"use asm"在一开始就造成了严重的速度减慢。

因此,用"use asm"替换"almost asm"是不安全的,但有时这还可以。你应该在你必须支持的所有浏览器版本中仔细测试你的应用程序(但要确保你在测试时关闭了devtools(-如果它有效,这意味着你有一个已经实现的幸运案例:继续替换。

不是最好的解决方案,但我用"use asm"替换了"几乎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

如果最后一个命令显示:

共享:调试:EMCC_WASM_BACKEND告诉我们使用WebAssembly后端

当你去构建时,它会有一个错误:

shared:CRITICAL:WebAssembly设置为目标,但LLVM尚未使用WebAssembly后端构建

因此,您需要确保LLVM在.emscripten文件中正确指向上游,并且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时,它应该说:

共享:调试:EMCC_WASM_BACKEND告诉我们使用asm.js后端

没有错误,使用构建

emcc -s WASM=0 --separate-asm -s WASM_BACKEND=0 -o build/asmjs.js main.c

如果需要,也可以输出build/asmjs.html。