Emscripten 好像没有使用 asm.js

问题描述 投票:0回答:3

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

目前我正在使用“emcc main.c -o out.html”进行编译,也尝试使用-02标志。

javascript emscripten asm.js
3个回答
4
投票

这是设计使然。有时它会生成(参见源代码

"almost asm"
而不是
"use asm"
,这会禁用所有asm.js优化。当编译的代码使用浏览器中未实现的某些功能(如此 v8 问题)时,就会发生这种情况。 对于我现在正在从事的项目,我已将 Firefox 的
"almost asm"
替换为
"use asm"
,并保留 Chrome 的原样,因为
"use asm"
在启动时导致严重减速。

因此,仅用

"almost asm"
替换
"use asm"
并不安全,但有时这可以正常工作。您应该在必须支持的所有浏览器版本中仔细测试您的应用程序(但确保您在关闭开发工具的情况下进行测试) - 如果它有效,这意味着您有一个已经实现的幸运案例:继续并替换。


1
投票

不是最好的解决方案,但我用“use asm”替换了“almost asm”,并且它可以在 Firefox 中使用(已正确编译并且可测量得更快)。

我也寻找了很长时间的解决方案来让 Emscripten 自己做到这一点,但没有找到解决方案。


0
投票

这应该很简单,但是如果您尝试了许多不同的版本,您可能有来自不同版本的配置文件需要修复。我将其编译为 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。

© www.soinside.com 2019 - 2024. All rights reserved.