Emscripten——使用 CMake 构建并用 Make 编译

使用 CMake 构建 在源文件目录添加 CMakeList.txt 文件 # 设置CMake版本最低要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称和版本 set(MyTarget hello)project(${MyTarget} VERSION 1.0)# 指定 C++ 标准 set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED True)# 编译生成.html文件 set(CMAKE_EXECUTABLE_SUFFIX ".html")# 添加源码文件和生成的目标文件的名称 # file(GLOB_RECURSE SRC_MAIN ./*.cpp) aux_source_directory(./ SRC_MAIN)aux_source_directory(./thirdParty/ SRC_MAIN)add_executable(${MyTarget} ${SRC_MAIN})# add_executable(${MyTarget} main.cpp) # 设置Emscripten的编译链接参数 set_target_properties(${MyTarget} PROPERTIES LINK_FLAGS " \ -s EXIT_RUNTIME=0 \ -gsource-map \ -s EXPORTED_FUNCTIONS=_main,_sayHello1,_jsonParse,_jsonParse1 \ -s EXPORTED_RUNTIME_METHODS=ccall,cwrap,addFunction \ -s NO_DISABLE_EXCEPTION_CATCHING \ ")# 添加第三方库路径 # target_link_directories(${MyTarget} # PUBLIC "${PROJECT_BINARY_DIR}" # ) # 将第三方库与主程序进行链接 # set(LIBS cjson) # target_link_libraries(sample ${LIBS}) # 添加头文件查找路径 target_include_directories(${MyTarget} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" ) 创建 build 文件夹,并在 build 文件夹内执行命令 emcmake cmake ....

March 24, 2022 · 1 min · Rick Cui

Emscripten——C++ 函数导出

导出 C++ 函数到 js 有多种方式: 方式一:在编译的时候指定 在编译命令中添加 -sEXPORTED_FUNCTIONS 参数,例如:-s EXPORTED_FUNCTIONS=_myFunction,_sayHello1 方式二:修改 C++ 函数 在 C++ 代码中需要导出的函数声明前添加 EMSCRIPTEN_KEEPALIVE 宏定义 #include <emscripten.h> extern "C" int EMSCRIPTEN_KEEPALIVE myFunction(int argc, char ** argv) { printf("我的函数已被调用\n"); return 0; } #ifdef __cplusplus extern "C" { #endif int EMSCRIPTEN_KEEPALIVE sayHello(){ cout << "hello from sayHello!" << endl; return 0; } int sayHello1() { Person p; cout << p.printInfo() << endl; return 0; } #ifdef __cplusplus } #endif 方式三:WebIDL Binder...

March 24, 2022 · 1 min · Rick Cui

Emscripten——Hello World

编译 新建 main.cpp 文件 #include <iostream>using namespace std; int main(){ cout << "hello world!" << endl; return 0; } 使用 emcc 或 em++ 编译 C++ 文件 执行命令 em++ main.cpp,会在同级目录下生成 a.out.js 和 a.out.wasm 两个文件。 使用 node 测试 测试命令 node a.out.js,会在控制台输出 cout 的内容 使用 html 页面 测试 执行命令 em++ main.cpp -o hello.html,会在同级目录下生成三个文件: hello.html:测试网页 hello.js:相关的胶水代码,包括加载 WASM 文件并执行调用等相关逻辑 hello.wasm:编译得到的核心 WebAssembly执行文件 在本地启动一个静态网站服务器,就可以在浏览器中访问生成的网页了 编译带有 调试 信息的测试页面...

March 24, 2022 · 1 min · Rick Cui

Emscripten——安装

启用 Linux 环境 这里使用的是 WSL(Windows Subsystem Linux)环境,环境配置参考这里 Linux 安装 Emscripten Download and install 安装 python3 sudo apt install python3 安装 git sudo apt install git 创建目录并 clone emsdk sudo git clone https://github.com/emscripten-core/emsdk.git 更新 emsdk 并激活 cd emsdk git pull # Download and install the latest SDK tools. ./emsdk install latest # Make the "latest" SDK "active" for the current user. (writes .emscripten file) ....

March 24, 2022 · 1 min · Rick Cui

数据结构与算法——连续子数组最大和

一、暴力算法 $\mathcal{O}(n^3)$ 遍历数组的所有子数组集合,并对其求和,筛选出和的最大值 int maxSumOfSub1(int* array, int length){ int maxSum = 0; int startIndex = 0, endIndex = 0; for(int i = 0; i < length; i++){ for(int j = i; j < length; j++){ int sum = 0; for(int k = i; k <= j; k++) sum += array[k]; if(maxSum < sum){ maxSum = sum; startIndex = i; endIndex = j; } } } cout << "Begin:" << startIndex << " End:" << endIndex << " Num:" << maxSum << endl; return maxSum; } 二、前缀和 $\mathcal{O}(n^2)$ 先把数组的前 i 项和求出来并将其保存到数组中,然后计算所有子数组集合的和,筛选其中最大的...

March 19, 2022 · 5 min · Rick Cui