javascript - Emscripten 在 Visual Studio 中导出函数异常

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

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

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

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。但如果是这样的话,我不知道为什么。

最佳答案

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

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

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

关于javascript - Emscripten 在 Visual Studio 中导出函数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27950115/

相关文章:

c - SIGSEGV 处理程序中的段错误

c - 我在 C 中用于两个集合的 UNION 的代码不起作用

javascript - 用户信息作为前端的全局变量

javascript - 如何使div平滑移动?

javascript - 运行 cypress 测试时,当我登录后访问新网址时,页面仅保留在当前网址上

C++ Array of Arrays,分别定义部分

C++ win客户端发送linux服务器变量

javascript - 从 angularjs 模态对话框服务返回数据

C++:快速/并行计算两个 `std::vector<double>` vector 之间的 L1 距离

c - recv() 什么时候返回?