Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试

这篇具有很好参考价值的文章主要介绍了Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:Web 端需要使用已有的 C++ 库(使用 CMake 编译),需要将 C++ 项目编译成 WebAssembly(.wasm) 供 js 调用。

上篇文章《Mac 上安装 Emscripten》 已讲解如何安装配置 Emscripten 环境。

本篇文章主要讲解如何将基于 CMakeLists 配置的 C++ 项目编译成 WebAssembly 库来供 Web 前端使用。编译结果会生成 .wasm、.js,测试代码会生成 .wasm、.js、.html。

一、构建基于 CMakeList 的 C++ 库及测试 Demo 工程

目录结构如下:

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试,工具,C/C++,CMake,wasm,Emscripten,CMakeList,wasm cmake 编译
比如 test_lib 就是我们原有的 C++ 库,这里测试简单写了个数学库,包含加法函数和减法函数。我们最终需要提供 libtest_lib.wasm 前端同学用。main.cpp 是自己用来测试 libtest_lib.wasm 的。所有涉及的代码及编译脚本在本文末尾。

二、编译项目库及测试 Demo

执行脚本 ./build_web.sh 记得给执行权限:chmod +x build_web.sh
脚本主要执行以下操作:

emcmake cmake -B build/web
emmake make
emcc libtest_lib.a -o libtest_lib.js

编译输出结果如下:
Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试,工具,C/C++,CMake,wasm,Emscripten,CMakeList,wasm cmake 编译

输出的 test_lib 库,在 cmake_demo/build/libs/web 目录下

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试,工具,C/C++,CMake,wasm,Emscripten,CMakeList,wasm cmake 编译

输出的测试 demo,在 cmake_demo/build/web 目录下

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试,工具,C/C++,CMake,wasm,Emscripten,CMakeList,wasm cmake 编译

三、测试

3.1 启动 Server

要在本地浏览器测试 .wasm 需要启动 server,否则报错,具体原因上篇文章《Mac 上安装 Emscripten》 有说明。

进入到 cmake_demo/build/web 所在目录执行 python -m http.server 9090 启动服务。

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试,工具,C/C++,CMake,wasm,Emscripten,CMakeList,wasm cmake 编译

3.2 在浏览器测试

在浏览器地址栏输入:

http://localhost:9090/test_main.html

可以看到如下结果:
与 main.cpp 里的函数调用预期结果一致。

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试,工具,C/C++,CMake,wasm,Emscripten,CMakeList,wasm cmake 编译

四、所有涉及的代码及编译脚本

math_test.h 代码如下:
只有两个函数:test_add、test_sub

/**
 * Author: AlanWang4523.
 * Date: 2023/10/31 16:08.
 * Mail: alanwang4523@gmail.com
 */

#ifndef CMAKEDEMO_MATH_TEST_H
#define CMAKEDEMO_MATH_TEST_H

#ifdef __cplusplus
extern "C" {
#endif

int test_add(int a, int b);
int test_sub(int a, int b);

#ifdef __cplusplus
}
#endif

#endif //CMAKEDEMO_MATH_TEST_H

math_test.cpp 代码如下:

/**
 * Author: AlanWang4523.
 * Date: 2023/10/31 16:08.
 * Mail: alanwang4523@gmail.com
 */

#include "math_test.h"

#ifdef __cplusplus
extern "C" {
#endif

int test_add(int a, int b) {
    return a + b;
}

int test_sub(int a, int b) {
    return a - b;
}

#ifdef __cplusplus
}
#endif

test_lib/CMakeLists.txt 代码如下:

include_directories(./)
include_directories(inc)
AUX_SOURCE_DIRECTORY(src DIR_TONE_CHANGE_SRCS)
add_library(test_lib ${DIR_TONE_CHANGE_SRCS})

math.cpp 代码如下:

#include <iostream>
#include "test_lib/inc/math_test.h"

int main(int argc, const char * argv[]) {
    std::cout << "Hello AlanWang4523\n";

    int ret = test_add(1, 2);
    std::cout << "test_add: 1 + 2 = " << ret << "\n" ;

    ret = test_sub(3, 2);
    std::cout << "test_sub: 3 - 2 = " << ret << "\n" ;
    return 0;
}

CMakeLists.txt 代码如下:

cmake_minimum_required(VERSION 3.6)
project(test_main)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_CXX_STANDARD 11)

include_directories(./ test_lib test_lib/inc)
add_subdirectory(test_lib)

set(CMAKE_EXECUTABLE_SUFFIX ".html") # 编译生成.html

add_executable(test_main main.cpp)
target_link_libraries(test_main test_lib)

build_web.sh 编译脚本如下:文章来源地址https://www.toymoban.com/news/detail-738379.html

#!/bin/sh

# @Time    : 2023-10-31 16:59
# @Author  : AlanWang
# @FileName: build_web.sh

OUTPUT_LIBS="./build/libs/web"

function build_for_webassembly() {

	BUILD_DIR="./build/web"

	PRE_EXE_DIR=$(pwd)
	echo ${PRE_EXE_DIR}

	emcmake cmake \
	-H"./" \
	-B"${BUILD_DIR}" \
	-DCMAKE_LIBRARY_OUTPUT_DIRECTORY="./build/web/libs/" \
	-DCMAKE_BUILD_TYPE="Release"


	cd ${BUILD_DIR}
	emmake make

	cd ${PRE_EXE_DIR}
	mkdir -p ${OUTPUT_LIBS}/
	mv ${PRE_EXE_DIR}/lib/* ${OUTPUT_LIBS}/
#	rm -r ./build/web

	TARGET_NAME=""
	for file in $(ls ${OUTPUT_LIBS})
  do
      if [ "${file##*.}" == "a" ]; then
          TARGET_NAME=${file%.*}
          break
      fi
  done

  echo "AlanTest::=====>>TARGET_NAME: ${TARGET_NAME}"

  emcc -s ALLOW_MEMORY_GROWTH=1 ${OUTPUT_LIBS}/${TARGET_NAME}.a -o ${OUTPUT_LIBS}/${TARGET_NAME}.js
}

build_for_webassembly

到了这里,关于Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 Emscripten + WebAssembly 实现浏览器操作 Excel

    【C++】使用WebAssembly在浏览器端操作Excel_wasm文件用什么打开_你的薄荷醇的博客-CSDN博客 使用WebAssembly在浏览器端操作Excel_wasm文件用什么打开 https://blog.csdn.net/weixin_44305576/article/details/125545900?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168964185516800185863561%2522%252C%2522scm%2522%253A%25

    2024年02月13日
    浏览(37)
  • vs项目转cmake(.sln转CMakeLists.txt)

    proj2cmake https://github.com/mrpi/proj2cmake 另附cmake镜像站:https://cmake.org/files/ 编译proj2cmake时报错: 可参考 https://www.cnblogs.com/tang-zhou-zhou/p/16067695.html 编译boost 使用vs2017的x64_x86交叉工具命令提示符进入解压后的boost文件夹运行bootstrap.bat toolset:编译器 msvc-17.0(vs2017)gcc(mingw) pre

    2024年02月09日
    浏览(49)
  • 解决Cmake编译 OPENCV_DNN_CUDA 报错: CMake Error at modules/dnn/CMakeLists.txt:39.

    首先,在camke编译过程中,不仅仅需要看报错的error部分,往上滑动会看见一行信息: 如果你没有装Cudnn,那么装上Cudnn再试试。注意,安装版本最低是7.5! 如果你装了7.5及以上版本还是会报错和有上面这行信息,请注意,这可能是在Cudnn 8版本以后的问题! 原因是cudnn 8的版本

    2024年02月16日
    浏览(48)
  • WebAssembly(WASM) 和云原生 | wasm和区块链

    Wasm,即WebAssembly,是一种用来补充JS在运行上不足的“低级”语言——基于二进制编写。其目标之一正是达到在网页上如同运行机器语言一样快速高效。其开发团队分别来自Mozilla、Google、Microsoft、Apple。 Wasm允许用户采用自己熟悉的语言书写(目前支持C/C++/Rust),再在虚拟机

    2024年02月02日
    浏览(39)
  • webassembly002 whisper.wasm wasm_eval 与js代码交互 js部分

    convert audio buffer to WAV # TODO changeInput函数 这个函数的作用是根据传入的参数 input 的不同值,控制页面上特定元素的显示和隐藏状态,从而根据用户的选择切换不同的输入方式 Module load model 加载模型文件 loadF函数 使用FileReader()对象加载本地文件 loadWhisper函数 会调用loadRemote(定

    2024年04月15日
    浏览(44)
  • cmake中多级CMakeLists.txt调用

      在c/c++工程开发中,往往会涉及多级CMakeLists.txt的调用,并且调用方式错综复杂,主要有以下两种方式: 子目录中的CMakeLists.txt 独立生成目标 ,不作为主目标生成过程主的依赖存在,与主目标并无任何关系。 子目录中的CMakeLists.txt 作为主目标的依赖源文件 ,不单独生成

    2024年02月02日
    浏览(40)
  • ROS功能包目录下CMakeLists.txt

    CMake基础教程(24)add_executable生成目标可执行文件 CMake中add_executable的使用 CMake中的add_executable命令用于使用指定的源文件向项目(project)添加可执行文件,其格式如下: 这里我们用到 Normal Executables这种用法,Normal Executables:添加一个名为的可执行目标(executable target),该目标将

    2024年02月11日
    浏览(40)
  • 【gcc, cmake, eigen, opencv,ubuntu】五.CMakeLists.txt编写

    1.CMakeLists.txt模板 一个使用opencv 的 CMakeLists.txt 对应的目录: 2.设置编程语言版本 3.设置编译类型Debug,Release 4.设置获取文件列表 MATH_LIB_SRC 指示:找到的math目录下的 c文件 5.添加include目录 表示在src/include/目录中寻找头文件 include_directories(src/include) 6.配置编译选项 add_compile_

    2024年02月09日
    浏览(40)
  • Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志

    Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志 C/C++代码里面常用的printf没法在Android 的logcat输出显示。需要特别配置C++才能显示在logcat里面。 (1)CMakeLists.txt定义: (2).cpp中: Android添加C++/CPP项目代码(2)_zhangphil的博客-CSDN博客 基于Windows平台,Android NDK(JNI)开发技术》

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包