FLAGS = -O0 \
-s ALLOW_MEMORY_GROWTH=1 \
-s TOTAL_MEMORY=134217728 \
-s NO_EXIT_RUNTIME=1 \
-s FORCE_FILESYSTEM=1 \
--memory-init-file 0 \
-s MODULARIZE=1 \
-s WASM=1 \
-s EXPORT_ES6=1 \
-s EXPORTED_FUNCTIONS="['_main']" \
-s EXPORTED_RUNTIME_METHODS=intArrayFromString,allocate,ALLOC_NORMAL \
-DNODEPS=1
这也很好地生成了 .wasm 文件和一个 .js 文件,但是当我将它包含在我的常规代码中时,“main”函数总是在没有任何参数的情况下自动调用。输出也是正确的,只列出了支持的参数——所以一切都很好,符合预期。
然而:
因为它是一个 C 程序,所以我需要“main”函数,所以据我所知,它需要列在“EXPORTED_FUNCTIONS”中,但我想稍后在我的代码中使用一些参数手动调用它。所以最初的自动调用是没有必要的。
到目前为止我尝试了什么:
我发现了一些添加标志的提示
--no-entry, INVOKE_MAIN=0, NO_INITIAL_RUN=1
甚至尝试在调用 Module.noInitialRun = true
之前在我的 JavaScript 代码中添加
Module["noInitialRun"] = true
或
Module().then(...
但是没有一个有效,也没有关于某些标志的任何文档,也没有它们存在但因为被弃用而被删除(这也很奇怪)
emcc -v
回报:
clang version 17.0.0 (https://github.com/llvm/llvm-project.git 6865cff8ea8b07d9f2385fd92cecb422404f0f35)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /opt/homebrew/Cellar/emscripten/3.1.35/libexec/llvm/bin
问题:
我必须配置/设置什么来避免在加载生成的 .js 和 .wasm 时自动调用 C 程序的“主要”功能?
尝试 -Dmain=SomeOtherName; Emscripten 文档声称可以“使用 emcc 作为 gcc 的直接替代品”,这表明您可以使用 -D 重命名 main 而无需更改源代码。Original comment by Ruud Helderman:
按照@ruud-helderman 的提议,我尝试设置
-Dmain=runMain
并将“虚拟”功能runMain
添加到-s EXPORTED_FUNCTIONS="['_runMain']
,这对我有用,“main”不再运行两次完美
我现在可以在我的 JavaScript 代码中像下面这样调用它:
import Module from './bin/test.js';
class TestWasm {
_testModule = null;
async init() {
this._testModule = await Module();
}
runProgram(args) {
this._testModule['_runMain'](argc, argv, 0);
}
}