Emscripten 在 Visual Studio 中导出函数异常

Emscripten exported function oddities in Visual Studio

我刚刚开始使用 Emscripten,但在尝试导出函数以用于 JavaScript 时,我 运行 发现了一些奇怪的东西。测试项目与 libsquish 有关,但它与问题无关,除了 header/code 文件名。

所以 - 无论如何,简单的测试。

c/c++

//squish.h
extern "C" int main();
int main();

extern "C" int gsr();
int gsr();

//squish.cpp
int main()
{
    return 99;
}

int gsr()
{
    //return squish::GetStorageRequirements(width,height,flags);
    return 8675309;
}

附加Options/Command行

-s EXPORTED_FUNCTIONS="['_gsr','_main']" 

Javascript

main=Module.cwrap('main','number',null);
console.log(main());

GetStorageRequirements = Module.cwrap('gsr', 'number',null);
console.log(GetStorageRequirements());

Javascript 控制台 (Chrome)

99
Assertion failed: Cannot call unknown function gsr (perhaps LLVM optimizations or closure removed it?)
Assertion failed: Cannot call unknown function gsr (perhaps LLVM optimizations or closure removed it?)

最重要的是,优化被禁用 (O0)。

那么,这是怎么回事?相同的 return 类型,相同数量的参数,以完全相同的方式定义,唯一的区别是函数的名称。然而,一个有效,另一个是 "unknown"。

唯一可能的、合乎逻辑的原因是它自动导出 main,而忽略了 EXPORTED_FUNCTIONS。但如果是这样的话,我不知道为什么。

这里的问题可能是 C++ 名称修改。那是一个 C++ 文件名,所以 "gsr" 变成类似“_Z3gsr”的东西。您可以通过将其设为 C 文件或围绕该方法使用 extern "C" 来避免这种情况。

详情请见http://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html#why-do-functions-in-my-c-c-source-code-vanish-when-i-compile-to-javascript-and-or-i-get-no-functions-to-process

感谢 Charles Ofria 在缩小问题范围方面所做的工作,唯一真正奇怪的是 Emscripten Visual Studio 插件。当我认为它可能只是自动导出 main 时,我走在了正确的轨道上——这是正确的。它没有导出其他函数的原因是因为我将它放在 Clang/C++ 部分的附加选项中,而不是 Emcc 链接器中。

问题是,这就是 "oddity" 出现的地方,当您选择 Console Application (.js) 作为配置类型时,Emcc 链接器部分不会出现。因此,在将目标扩展更改为 .html 并将配置类型更改为 Browser Application (.html) 之后 - 链接器部分重新出现,我能够将 EXPORTED_FUNCTIONS 选项放在正确的位置。

构建并复制输出后,定义了两个函数,并在 Javascript 控制台中返回了正确的值。