如何避免自动调用函数"main"



我想使用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 = trueModule["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);
}
}

相关内容

  • 没有找到相关文章

最新更新