Emscripten在Visual Studio中导出函数奇特

时间:2015-01-14 18:38:29

标签: javascript c++ c visual-studio-2010 emscripten

我刚刚开始玩Emscripten,但在尝试导出函数时,我遇到了一些奇怪的东西,用于JavaScript。测试项目与libsquish有关,但除了头文件/代码文件名之外,它与问题无关。

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

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;
}

其他选项/命令行

-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)。

那么,这里的交易是什么?相同的返回类型,相同数量的参数,以完全相同的方式定义,唯一的区别是函数的名称。然而一个是有效的,另一个是“未知的”。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

这里的问题可能是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