首页 > 其他分享 >emscripten cmake 简单尝试

emscripten cmake 简单尝试

时间:2023-12-04 10:05:12浏览次数:31  
标签:尝试 src emscripten int add wasm cmake

emscripten 提供了比较完整的工具链,包含了对于make 以及cmake 等工具的支持,以下是一个简单的c 代码转换为 wasm的demo
同时基于cmake 进行项目管理

参考项目

  • 项目结构
├── CMakeLists.txt
├── README.md
├── app.js
└── src
    ├── add.c
    ├── add.h
    └── app.c
├── README.md
  • 代码简单说明
    CMakeLists.txt cmake 定义

 

cmake_minimum_required(VERSION 3.20.0)
 
project(emccdemo)
 
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXECUTABLE_SUFFIX .js)
 
set(TD_LINKER_FLAGS "-Wl,--gc-sections -Wl,--exclude-libs,ALL") 
# 编译为可执行任务
add_executable(myadd src/add.c)
# 构建参数相关的,方便构建模块
target_link_libraries(myadd "-s MODULARIZE=1 -s EXPORTED_RUNTIME_METHODS=ccall")
src/add.h src/add.c 主要是一个标准的c 代码,同时集成了emscripten 方便暴露c 方法为wasm 方法

src/add.h 
#ifndef ADD_H
 
#define ADD_H
 
int add(int a, int b);
 
int dalongdemoadd(int a, int b);
 
#endif
 
src/add.c
#include <emscripten.h>
#include "add.h"
// 属性,确保编译的时候可以暴露为wasm 方法
EMSCRIPTEN_KEEPALIVE
int add(int a,int b) {
    return a+b;
}
// 属性,确保编译的时候可以暴露为wasm 方法
EMSCRIPTEN_KEEPALIVE
int dalongdemoadd(int a, int b) {
    return a+b;
}

 

project(emccdemo)

构建

为了方便构建使用了docker

  • 启动docker
docker run -it -v $PWD:/src  emscripten/emsdk:3.1.47 sh
  • 构建
mkdir build
cd build emcmake cmake ..
make
  • 效果

emscripten cmake 简单尝试_github

nodejs 代码访问wasm 模块

  • app.js

基于以上的配置参数以及构建myadd 会是一个标准的node commonjs 模块,可以nodejs 使用
如下

emscripten cmake 简单尝试_#include_02

代码

 

const app = require("./build/myadd")
app().then((instance) => {
console.log(instance._dalongdemoadd(1,3)); // direct calling works
})
  • 效果

emscripten cmake 简单尝试_#include_03

说明

以上是一个简单的试用,实际上emscripten 提供了不少强大的功能,对于c/c++ 周边的应用到wasm 是一个首选方案,社区已经有不少项目就是基于
emscripten 编译为wasm(opencv,fffmpeg。。。)

参考资料

https://emscripten.org/
https://github.com/rongfengliang/emscripten_basic_learning
https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html

标签:尝试,src,emscripten,int,add,wasm,cmake
From: https://blog.51cto.com/rongfengliang/8673434

相关文章

  • cmake构建项目,缺少库文件
    问题概述使用vscode,用cmake进行项目构建是,缺少库文件,出现findapackageconfigurefileprovidedby"Snappy",butCmakedidnotfindone错误;操作系统ubuntu22.04错误如下图所示:解决方案此处以上图中的“Snappy”为例缺少相应的库文件,即去github上找到相应的库文件,下......
  • 【ToolChains】| CMake 技巧
    判断CMake编译环境编译类型CMAKE_BUILD_TYPE可取值为:Debug,Release,RelWithDebInfo,MinSizeRel等预设值if(CMAKE_BUILD_TYPEMATCHESDebug)#dosomethingendif()系统环境CMAKE_SYSTEM_NAME代表当前系统的类型,值有ANDROID,APPLE,IOS,UNIX,WIN32,WINC......
  • windows 上 cmake 添加 vcpkg 选项
    使用cmake编写相关的工程时,工程有时会使用vcpkg添加的第三方库,比如zip库查看一些案例后,我发现有些回答不太准确,遂记录下现在,我们需要在工程中使用 zip_open函数执行压缩命令,这个函数是zip.h里的,所以我们先要添加zip库打开cmd,输入vcpkginstalllibzip:x86-window......
  • nanomq clion 远程debug尝试
    很简单因为nanomq是基于cmake开发的对于clion来说基于debug就比较方便了,同时因为nanomq相关依赖都是通过模块的,还是比较方便的,以下是一个简单的debug测试环境准备基于clion的remotesshclone代码 gitclonehttps://github.com/emqx/nanomq.gitcdnanomqgitsubmoduleup......
  • MAC电脑无法启动深信服代理软件,提示“初始化失败,请尝试重新安装”
    1、launchctlprint-disabledsystemgrepsangfor  查看是否被禁用,如果是true就是被禁用2、sudolaunchctlenablesystem/com.sangfor.EasyMonitor启用命令3、sudolaunchctlload/Library/LaunchDaemons/com.sangfor.EasyMonitorplist 使生效 ......
  • Self-Supervised Depth——一个小小的尝试
    一.选择原因。Self-SupervisedDepth是一种用于图像分割的深度学习模型。它是基于Self-Supervised模型的改进,通过引入链接模块和下采样模块来提高分割性能。Self-SupervisedDepth的核心思想是在Self-Supervised的基础上引入链接模块和下采样模块。链接模块用于捕捉不同尺度的特征......
  • cmake Ninja 集成试用
    核心比较简单就是添加Ninja的依赖工具,然后再构建的时候指定生成器为Ninja使用安装ninja我使用的mac系统 brewinstallninja生成前提是已经有了一个CMakeLists.tx同时还没有初始化 cmake-GNinja..效果 构建比较快 cmake--build.效果├──CMakeCache.txt├──......
  • cmake 进行rpm包构建
    cmake实际上包含了构建,测试,以及打包的能力,以下是一个简单的rpm打包测试(cpack模块)项目结构├──CMakeLists.txt├──README.md├──add.c├──add.h└──main.c├──README.md代码说明main.c为一个入口(可执行文件)CMakeLists.txt是cmake的定义包含了基于cpack......
  • emscripten 中c 代码引用外部js 函数
    主要是一个简单的学习,webassebly支持通过import调用环境的函数(比如调用浏览器或者nodejs中的一些方法)简单说明方法很多,包含了emscripten提供的调用js的宏,但是以下使用了一个emscripten提供的--js-library功能--js-library简单说明--js-library主要是实现emcc在编......
  • emscripten cmake 简单尝试
    emscripten提供了比较完整的工具链,包含了对于make以及cmake等工具的支持,以下是一个简单的c代码转换为wasm的demo同时基于cmake进行项目管理参考项目项目结构├──CMakeLists.txt├──README.md├──app.js└──src├──add.c......