我刚刚开始玩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。但如果是这样的话,我不知道为什么。
答案 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"
来避免这种情况。