如何避免 emscripten 自动调用“main”函数

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

我想使用 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_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 程序的“主要”功能?

javascript c program-entry-point webassembly emscripten
1个回答
0
投票

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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.