我想使用Emscripten从c程序生成WebAssembly。我为emcc使用以下标志:
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_function "中列出。据我所知,但我想在稍后的时间点用一些参数在代码中手动调用它。因此,最初的自动呼叫是没有必要的。
我试过了:
我发现了一些提示添加标志,如--no-entry, INVOKE_MAIN=0, NO_INITIAL_RUN=1
,甚至试图添加Module.noInitialRun = true
或Module["noInitialRun"] = true
在我的JavaScript代码之前调用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
问题:
我必须配置/设置什么来避免C程序的'main'函数在加载生成的。js和。wasm时自动调用?
Original comment by Ruud Helderman:
尝试-Dmain = SomeOtherName;Emscripten文档声称可以"使用emcc作为gcc的临时替代品",这表明您可以使用-D来重命名main,而无需更改源代码。
根据@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);
}
}