Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Emscripten在Visual Studio中导出函数异常_Javascript_C++_C_Visual Studio 2010_Emscripten - Fatal编程技术网

Javascript Emscripten在Visual Studio中导出函数异常

Javascript Emscripten在Visual Studio中导出函数异常,javascript,c++,c,visual-studio-2010,emscripten,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() { //ret

我刚刚开始使用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']" 
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?)
Javascript

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

GetStorageRequirements = Module.cwrap('gsr', 'number',null);
console.log(GetStorageRequirements());
Javascript控制台(Chrome)

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

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


唯一可能的逻辑原因是它会自动导出main,同时忽略导出的函数。但如果是这样的话,我不知道为什么

>这里可能是C++名称的错误。这是一个C++文件名,所以“GSR”变成了“ZY3GSR”。您可以通过将其设置为C文件或围绕该方法使用
extern“C”
来避免这种情况


更多信息请参见多亏Charles Ofria在缩小问题范围方面所做的工作,唯一真正奇怪的是Emscripten Visual Studio插件。当我认为它可能只是自动导出主数据时,我的思路是正确的——这是正确的。它没有导出另一个函数的原因是,我将它放在了附加选项中,用于Clang/C++部分,而不是Emcc链接器

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


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

我的印象是,使用
extern“C”
声明方法,然后在外部声明它,并在.cpp文件中定义方法,就可以实现这一点。或者是第二个(c++)声明的情况,在某种程度上破坏了它?你的程序对我来说工作得很好,在Chrome的控制台日志中打印99然后打印8675309。我将上面的C++代码复制到“Sigy.cc”中,然后运行:EMCCC Syth.cc-s ExtutuxOffice=“[Y-GSR”,'My'' ],然后我添加了代码> <代码>到HTML文件,以及上面的脚本标记中的代码。我和你做的有什么不同吗?除了扩展(cpp vs cc)和使用visual studio而不是命令行之外,没有。我想我会尝试使用emscripten命令行,看看是否有不同的结果。通过命令行运行它很有效。所以,现在我知道在vstudio中有一些设置不正确。