首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用CMake时用Emscripten导出C函数

如何在使用CMake时用Emscripten导出C函数
EN

Stack Overflow用户
提问于 2020-06-25 12:48:02
回答 3查看 2.3K关注 0票数 5

本教程中,它展示了导出C函数的以下示例

代码语言:javascript
复制
./emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS='["_int_sqrt"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'

我也想做同样的事情,除非我像这样使用CMake

代码语言:javascript
复制
cd bin
emcmake cmake ../src
emmake make

在emmake中指定-s的规范方法是什么?我应该把它添加到CMakeLists.txt中吗

代码语言:javascript
复制
set(EXPORTED_FUNCTIONS '["_int_sqrt"]')

或者做类似的事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-25 13:59:57

到目前为止,我发现它可以通过以下设置实现CMake

代码语言:javascript
复制
# Here you can add -s flag during compiling object files
add_definitions("-s EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\"]'")
add_definitions("-s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\"]'")
add_definitions("-s EXPORTED_FUNCTIONS='[\"_testInt\"]'")
# Here you can add -s flag during linking
set_target_properties(web_mealy_compiler PROPERTIES LINK_FLAGS "-s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall','cwrap']")
# Set this if you want to to generate sample html file
set(CMAKE_EXECUTABLE_SUFFIX ".html")

然后,您应该能够从javascript调用C函数,如下所示:

代码语言:javascript
复制
<script type="text/javascript">
     
    Module['onRuntimeInitialized'] = function() {
     
        console.log("wasm loaded ");
        
        console.log(Module.ccall); // make sure it's not undefined
        console.log(Module._testInt); // make sure it's not undefined
        console.log(Module._testInt()); // this should work
        console.log( Module.ccall('testInt', // name of C function
            'number', // return type
             [], // argument types
             []) // argument values
        );
    }
</script>

这是C函数的定义:

代码语言:javascript
复制
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE
int testInt(){
    return 69420;
}
票数 3
EN

Stack Overflow用户

发布于 2020-08-06 12:22:20

这是现在最简单/最干净的方式:

代码语言:javascript
复制
target_link_options(target PRIVATE
        -sEXPORTED_FUNCTIONS=['_main','_foo','_bar'])

如果您有更多的-s设置(可能会),您可以在这个函数调用中添加它们,或者可以多次调用target_link_options,两者都可以工作。这似乎很通融,我不需要逃避任何事情。

票数 4
EN

Stack Overflow用户

发布于 2020-08-06 06:59:57

我刚刚遇到了完全相同的问题,甚至在Emscripten页面上启动了一个问题(参见这里)。

对我来说起作用的是将所有特定于Emscripten的标志放入一个长字符串中,然后我用target_compile_options和target_link_options添加了这个字符串。

代码语言:javascript
复制
  set(EMS
      "SHELL:-s EXPORTED_FUNCTIONS=['_main','_malloc','_int_sqrt'] -s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall','cwrap']"
  )
  target_compile_options(EmscriptenExample PRIVATE ${EMS})
  target_link_options(EmscriptenExample PRIVATE ${EMS})

从函数列表中删除双引号和空格是的重要,否则它将无法工作。至少在CMake 3.17.3转义后,双引号对我不起作用。

为了完整起见: /edit现在允许删除-s前缀和实际标志之间的空格。这使得实际使用CMake自己的target_*_options函数成为可能,例如:

代码语言:javascript
复制
target_link_options(target PRIVATE -sEXPORTED_FUNCTIONS=['_main','_foo','_bar'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62575726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档