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"
来避免这种情况。
感谢 Charles Ofria 在缩小问题范围方面所做的工作,唯一真正奇怪的是 Emscripten Visual Studio 插件。当我认为它可能只是自动导出 main 时,我走在了正确的轨道上——这是正确的。它没有导出其他函数的原因是因为我将它放在 Clang/C++ 部分的附加选项中,而不是 Emcc 链接器中。
问题是,这就是 "oddity" 出现的地方,当您选择 Console Application (.js)
作为配置类型时,Emcc 链接器部分不会出现。因此,在将目标扩展更改为 .html
并将配置类型更改为 Browser Application (.html)
之后 - 链接器部分重新出现,我能够将 EXPORTED_FUNCTIONS
选项放在正确的位置。
构建并复制输出后,定义了两个函数,并在 Javascript 控制台中返回了正确的值。
我刚刚开始使用 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"
来避免这种情况。
感谢 Charles Ofria 在缩小问题范围方面所做的工作,唯一真正奇怪的是 Emscripten Visual Studio 插件。当我认为它可能只是自动导出 main 时,我走在了正确的轨道上——这是正确的。它没有导出其他函数的原因是因为我将它放在 Clang/C++ 部分的附加选项中,而不是 Emcc 链接器中。
问题是,这就是 "oddity" 出现的地方,当您选择 Console Application (.js)
作为配置类型时,Emcc 链接器部分不会出现。因此,在将目标扩展更改为 .html
并将配置类型更改为 Browser Application (.html)
之后 - 链接器部分重新出现,我能够将 EXPORTED_FUNCTIONS
选项放在正确的位置。
构建并复制输出后,定义了两个函数,并在 Javascript 控制台中返回了正确的值。