RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

WebAssembly_Web運行CC++程序(win10)

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:44 ? 次閱讀

1. WebAssembly技術介紹

WebAssembly是2015年誕生的一項新的技術,在2015年7月,Wasm首次對外公開,并正式開始設計,同年,W3C成立了Wasm社區(qū)小組(成員包括Chrome、Edge、Firefox和WebKit),致力于推動Wasm技術的早期發(fā)展。

wasm 是一個可移植、體積小、加載快并且兼容 Web 的全新格式。

WebAssembly的中文官網:webassembly.org.cn/

來至官網的介紹:

WebAssembly 是由主流瀏覽器廠商組成的 W3C 社區(qū)團體 制定的一個新的規(guī)范。

高效 WebAssembly 有一套完整的語義,實際上 wasm 是體積小且加載快的二進制格式, 其目標就是充分發(fā)揮硬件能力以達到原生執(zhí)行效率

安全 WebAssembly 運行在一個沙箱化的執(zhí)行環(huán)境中,甚至可以在現(xiàn)有的 JavaScript 虛擬機中實現(xiàn)。在web環(huán)境中,WebAssembly將會嚴格遵守同源策略以及瀏覽器安全策略。

開放 WebAssembly 設計了一個非常規(guī)整的文本格式用來、調試、測試、實驗、優(yōu)化、學習、教學或者編寫程序??梢砸赃@種文本格式在web頁面上查看wasm模塊的源碼。

標準 WebAssembly 在 web 中被設計成無版本、特性可測試、向后兼容的。WebAssembly 可以被 JavaScript 調用,進入 JavaScript 上下文,也可以像 Web API 一樣調用瀏覽器的功能。當然,WebAssembly 不僅可以運行在瀏覽器上,也可以運行在非web環(huán)境下。

由于不同的計算機 CPU 架構不同,機器碼標準有所差別,常見的架構有 x86、AMD 64、ARM,因此高級語言編譯成可執(zhí)行代碼時需要指定目標架構。

WebAssembly 抹平了不同 CPU 架構的機器碼,WebAssembly 的機器碼不能放在任何一個平臺上運行,但由于非常接近機器碼,可以被非??焖俚姆g為對應架構的機器碼。因此,WebAssembly 的運行速度和機器碼非常接近。

通過官網的介紹看出,WebAssembly技術的目的就是提高web端代碼性能,總所周知C/C++語言的運行性能一直是天花板,許多 3D 游戲,大型圖形編輯相關的工具軟件都是用 C/C++ 語言寫的,如果能把C/C++代碼搬到web端運行,那么理論上可以大大提高web端的運行效率。

要使用WebAssembly技術,需要先安裝Emscripten編譯器,這個Emscripten編譯器可以將 C/C++ 代碼編譯成 JS 代碼,但不是普通的 JS,而是一種叫做 asm.js 的 JavaScript 變體。

image-20220216140201666

在WebAssembly官網有介紹如何編譯安裝Emscripten SDK,網站地址: webassembly.org.cn/getting-sta…

image-20220216140016455

Emscripten的官網也有詳細介紹: emscripten.org/docs/gettin…

image-20220216140034973

2. 安裝Emscripten編譯器

官網上有步驟介紹,這里再把安裝的步驟做個總結。

注: 當前是在win10 64 位環(huán)境下操作。

(1)需要先安裝python環(huán)境,推薦安裝python3.X,因為Emscripten編譯器里用到了python命令。

python環(huán)境安裝看這里:

xiaolong.blog.csdn.net/article/det…

xiaolong.blog.csdn.net/article/det…

(2)安裝Git工具,因為需要使用git命令在線從倉庫下載需要的文件。

Git工具安裝看這里:翻到Git工具安裝章節(jié)。

blog.csdn.net/xiaolong112…

(3)從GitHub倉庫下載編譯器項目文件,選擇一個英文目錄,鼠標右鍵,打開git命令行。(安裝完Git工具后會自動關關鍵鼠標右鍵)

image-20220216141158931

運行下面命令進行下載,過程中需要等待一段時間。

git clone https://github.com/emscripten-core/emsdk.git 
復制代碼

下載成功后,當前目錄下會出現(xiàn)一個emsdk目錄。

(4)在當前目錄下的文件夾地址欄里輸入cmd,按下回車,快速打開cmd命令終端。

image-20220216141552254

輸入命令進入到emdk目錄下。

cd emsdk
復制代碼

(5)安裝最新的SDK并激活,在當前命令行繼續(xù)輸入命令。 注: 安裝要一點時間,需要耐心等待,具體速度看網絡情況。

emsdk install latest
emsdk activate latest --permanent
復制代碼

完成輸出的過程:

C:\Qt\emsdk>emsdk install latest
Installing SDK 'sdk-releases-upstream-37fc7647c754ac9a28ad588c143b82286de0ef71-64bit'..
Skipped installing node-12.18.1-64bit, already installed.
Skipped installing python-3.7.4-pywin32-64bit, already installed.
Skipped installing java-8.152-64bit, already installed.
Installing tool 'releases-upstream-37fc7647c754ac9a28ad588c143b82286de0ef71-64bit'..
Downloading: C:/Qt/emsdk/zips/37fc7647c754ac9a28ad588c143b82286de0ef71-wasm-binaries.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/37fc7647c754ac9a28ad588c143b82286de0ef71/wasm-binaries.zip, 476624087 Bytes
Unpacking 'C:/Qt/emsdk/zips/37fc7647c754ac9a28ad588c143b82286de0ef71-wasm-binaries.zip' to 'C:/Qt/emsdk/upstream'
Done installing tool 'releases-upstream-37fc7647c754ac9a28ad588c143b82286de0ef71-64bit'.
Running post-install step: npm ci ...
Running post-install step: npm install google-closure-compiler-windows
Done running: npm ci
Done installing SDK 'sdk-releases-upstream-37fc7647c754ac9a28ad588c143b82286de0ef71-64bit'.
?
C:\Qt\emsdk>emsdk activate latest --permanent
Registering active Emscripten environment permanently
?
Setting the following tools as active:
  node-12.18.1-64bit
  python-3.7.4-pywin32-64bit
  java-8.152-64bit
  releases-upstream-37fc7647c754ac9a28ad588c143b82286de0ef71-64bit
?
Setting environment variables:
PATH = C:\Qt\emsdk;C:\Qt\emsdk\node\12.18.1_64bit\bin;C:\Qt\emsdk\python\3.7.4-pywin32_64bit;C:\Qt\emsdk\java\8.152_64bit\bin;C:\Qt\emsdk\upstream\emscripten;C:\Users\11266\AppData\Local\Programs\Python\Python38-32\Scripts;C:\Users\11266\AppData\Local\Programs\Python\Python38-32;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;C:\Users\11266\AppData\Local\Programs\Microsoft VS Code\bin;C:\MinGW\i686-8.1.0-release-posix-dwarf-rt_v6-rev0\mingw32\bin;C:\OpenCV_3.4.7\OpenCV-MinGW-Build-OpenCV-3.4.7\x86\mingw\bin;%USERPROFILE%.dotnet\tools;C:\FFMPEG\ffmpeg_x86_4.2.2\bin;C:\FFMPEG\ffmpeg_x86_x64_3.3.2\bin;C:\Users\11266\AppData\Roaming\npm
Global environment variables up to date
復制代碼

(6)在命令行輸入em++ -v測試編譯器是否安裝成功。

出現(xiàn)以下提示,表示編譯器已經安裝成功。

C:\Qt\emsdk>emcc -v
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.10
clang version 12.0.0 (Cswircachegitchromium.googlesource.com-external-github.com-llvm-llvm--project 445289aa63e1b82b9eea6497fb2d0443813a9d4e)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:/Qt/emsdk/upstream/bin
shared:INFO: (Emscripten: Running sanity checks)
?
C:\Qt\emsdk>em++ -v
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.10
clang version 12.0.0 (Cswircachegitchromium.googlesource.com-external-github.com-llvm-llvm--project 445289aa63e1b82b9eea6497fb2d0443813a9d4e)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:/Qt/emsdk/upstream/bin
shared:INFO: (Emscripten: Running sanity checks)
?
C:\Qt\emsdk>
復制代碼

(7)這時可以先關閉當前終端,再重新開一個新終端,運行emcc或者em++查看幫助,會出現(xiàn)以下提示。

C:\Users\11266>cd /d D:\linux-share-dir\tmp\WebAssembly_TestCode
?
D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc -help
?
==============================================================================
Welcome to Emscripten!
?
This is the first time any of the Emscripten tools has been run.
?
A settings file has been copied to ~/.emscripten, at absolute path: C:\Users\11266.emscripten
?
It contains our best guesses for the important paths, which are:
?
 LLVM_ROOT    = /usr/bin
 NODE_JS     = C:\Program Files\nodejs\node.exe
 EMSCRIPTEN_ROOT = C:\Qt\emsdk\upstream\emscripten
?
Please edit the file if any of those are incorrect.
?
This command will now exit. When you are done editing those paths, re-run it.
==============================================================================
復制代碼

打開當前系統(tǒng)的用戶目錄,會看到一個.emscripten文件。這個文件里存放了編譯器需要的環(huán)境變量和路徑。

如果后續(xù)運行emcc或者em++命令編譯程序時報錯,例如:

D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc hello.cpp -Os -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm
shared:ERROR: BINARYEN_ROOT is set to empty value in C:\Users\11266/.emscripten
?
D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc hello.cpp -Os -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm
cache:INFO: generating system asset: is_vanilla.txt... (this will be cached in "C:\Users\11266.emscripten_cache\is_vanilla.txt" for subsequent builds)
shared:ERROR: llc executable not found at `C:\Users\11266/upstream/bin\llc.exe`
復制代碼

解決辦法:將.emscripten文件里的所有路徑改成絕對路徑。

例如:原來的路徑

import os
emsdk_path = os.path.dirname(os.environ.get('EM_CONFIG')).replace('\', '/')
NODE_JS = emsdk_path + '/node/12.18.1_64bit/bin/node.exe'
PYTHON = emsdk_path + '/python/3.7.4-pywin32_64bit/python.exe'
JAVA = emsdk_path + '/java/8.152_64bit/bin/java.exe'
LLVM_ROOT = emsdk_path + '/upstream/bin'
BINARYEN_ROOT = emsdk_path + '/upstream'
EMSCRIPTEN_ROOT = emsdk_path + '/upstream/emscripten'
TEMP_DIR = emsdk_path + '/tmp'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
復制代碼

修改后的配置文件路徑:

import os
NODE_JS = 'C:/Qt/emsdk/node/12.18.1_64bit/bin/node.exe'
PYTHON = 'C:/Qt/emsdk/python/3.7.4-pywin32_64bit/python.exe'
JAVA = 'C:/Qt/emsdk/java/8.152_64bit/bin/java.exe'
LLVM_ROOT = 'C:/Qt/emsdk/upstream/bin'
BINARYEN_ROOT = 'C:/Qt/emsdk/upstream'
EMSCRIPTEN_ROOT = 'C:/Qt/emsdk/upstream/emscripten'
TEMP_DIR = 'C:/Qt/emsdk/tmp'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
復制代碼

再重新運行即可:

D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc hello.cpp -Os -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm
cache:INFO: generating system asset: generated_struct_info.json... (this will be cached in "C:\Users\11266.emscripten_cache\wasm-obj-pic\generated_struct_info.json" for subsequent builds)
cache:INFO: - ok
復制代碼

3. 編寫C/C++代碼瀏覽器運行測試

(1)編寫一個簡單的C/C++代碼

#include 
int main() 
{
  printf("Hello World! \n");
    printf("WebAssembly 牛逼!\n");
  return 0;
}
復制代碼

(2)使用emcc編譯編譯

D:>cd /d D:\linux-share-dir\tmp\WebAssembly_TestCode
?
D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc hello.cpp -s WASM=1 -O3 -o hello-emcc.js
D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc hello.cpp -s WASM=1 -O3 -o hello-emcc.html
復制代碼

編譯成功之后,在目錄下會生成:js,html,wasm 等3個文件。

image-20220216144752704

(3)開一個HTTP服務器,測試網頁運行效果

在當前編譯目錄,使用python開一個HTTP服務器。

D:\linux-share-dir\tmp\WebAssembly_TestCode>python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
復制代碼

打開Edge瀏覽器(win10自帶的瀏覽器),輸入http://127.0.1:8000。

image-20220216145318947

選擇hello-emcc.html文件打開。下面是運行效果。

image-20220216145352353

也可以使用 emrun 命令來創(chuàng)建一個 http 協(xié)議的 web server 展示編譯后的文件,和前面python命令的功能類似。

$ emrun --no_browser --port 8080
復制代碼

4. 編寫C/C++代碼給前端調用測試

(1)編寫一個函數(shù),用于測試調用

#include 
#include 
?
int func_square(int x) 
{
 return x * x;
}
?
int func_sum(int x, int y) 
{
 return x + y;
}
?
char* func_string(char* str) 
{
 return str;
}
復制代碼

(2)編譯成wasm文件

D:\linux-share-dir\tmp\WebAssembly_TestCode>emcc hello.c -Os -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm
復制代碼

(3)編寫一個js文件。名稱為: loader.js

function loadWebAssembly(filename, imports = {}) {
 return fetch(filename)
   .then(response => response.arrayBuffer())
   .then(buffer => {
   imports.env = imports.env || {}
   Object.assign(imports.env, {
    memoryBase: 0,
    tableBase: 0,
    __memory_base: 0,
    __table_base: 0,
    memory: new WebAssembly.Memory({ initial: 256, maximum: 256 }),
    table: new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' })
    })
   return WebAssembly.instantiate(buffer, imports)
   })
   .then(result => result.instance )
}
?
function loadJS (url, imports = {}) {
 return fetch(url)
   .then(response => response.text())
   .then(code => new Function('imports', `return (${code})()`))
   .then(factory => ({ exports: factory(imports) }))
}
復制代碼

(4)編寫一個HTML文件調用函數(shù)接口 : 例如: index.html


?

Compile C to WebAssembly

The test result can be found in console.

? 復制代碼

(5)啟動http服務器,訪問測試。

python -m http.server
復制代碼

打開谷歌瀏覽器輸入地址訪問: http://127.0.0.1:8000/index.html

運行后,按下F12,查看控制臺的輸出。

image-20220217175755657

注意:如果要反復修改HTML文件測試結果,瀏覽器最好打開無痕模式進行測試。

在瀏覽器里可以看到wasm轉成wast文本格式的代碼,從代碼里可以看到導出的函數(shù)。

image-20220217180042334

5. webassembly在線調試工具

地址:wasdk.github.io/WasmFiddle/

image-20220217103905595

6. wasm2wast工具安裝

wasm2wast這個工具是將 WebAssembly 二進制轉換為 S-expressions。他是命令行工具,一個二進制文件作為輸入,輸出一個包含可以讀文本的文件。開發(fā)者可以編輯文本文件,然后再將其轉換為二進制文件,比如優(yōu)化算法、追蹤問題、插入調試語句等等。

地址: github.com/WebAssembly…

用法示例:

wast2wasm demo.wast -o demo.wasm
?
wasm2wast demo.wasm -o demo.wast
復制代碼

7. emsdk常用命令介紹

(1)emcc -v 顯示安裝的版本號
?
(2)em++ -v 顯示安裝的版本號
?
(3)emsdk update  更新emssk庫到最新版
?
(4)emsdk list --old 查看emsdk歷史版本號列表
?
(5)emsdk list --old > sdklist.txt 將歷史版本號寫入到sdklist.txt文件中
?
(6)emsdk install <版本號> 安裝對應版本號的sdk tool
例如: emsdk install 1.39.7
     
(7)emsdk install latest 安裝最新版本號的std tool
?
(8)emsdk activate <版本號> 激活對應版本號的std tool ,也就是設置當前使用的版本
例如:emsdk activate --embedded 1.39.7 --permanent
?
?
(9)emsdk uninstall <版本號> 卸載對應版本號的sdk tool
?
?
(10)emsdk help 或者 emsdk --help  查看幫助
復制代碼

8. 總結

image-20220216171629754
審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1262

    瀏覽量

    69440
  • 編譯器
    +關注

    關注

    1

    文章

    1623

    瀏覽量

    49108
  • Win10
    +關注

    關注

    2

    文章

    710

    瀏覽量

    39980
收藏 人收藏

    評論

    相關推薦

    win10下無法運行STVD怎么解決?

    win10運行STVD的時候,出現(xiàn)這個問題,不知要怎么解決。謝謝
    發(fā)表于 04-10 06:39

    win10使用技巧有哪些 win10使用技巧分享

    win10使用技巧有哪些?近來有很多朋友問有沒有win10系統(tǒng)的基本使用教程,大家都知道,win10增加了很多小功能,給我們帶來了很多方便,如果了解這些使用技巧可以達到事半功倍的效果。下面給大家?guī)?/div>
    發(fā)表于 09-05 08:53

    Win10 激活工具

    win10/win8激活工具
    發(fā)表于 02-07 16:14 ?52次下載

    CC++編程指南

    CC++編程指南
    發(fā)表于 10-27 14:45 ?9次下載
    <b class='flag-5'>CC++</b>編程指南

    Win10 強制更新重啟解決辦法

    裝了WIN10的小伙伴肯定是被WIN10很多問題給困擾了吧,尤其是軟件兼容,為了找到一個WIN10版本的軟件,總是要歷盡千辛萬苦,才能正常運行軟件,打開
    的頭像 發(fā)表于 09-08 11:56 ?1.6w次閱讀

    想要安裝win10系統(tǒng),它對電腦的最低配置是什么

    很多朋友在自己組裝電腦的時候由于預算不足,想要組裝一臺能夠運行win10系統(tǒng)流暢的低配電腦,這個時候就要考慮到win10系統(tǒng)配置的要求了。
    的頭像 發(fā)表于 03-14 14:21 ?9910次閱讀

    win10的Proteus 8應用程序安裝教程免費下載

    本文檔的主要內容詳細介紹的是win10的Proteus 8應用程序安裝教程免費下載。
    發(fā)表于 04-26 08:00 ?26次下載
    <b class='flag-5'>win10</b>的Proteus 8應用<b class='flag-5'>程序</b>安裝教程免費下載

    如何關閉win10的網絡搜索功能

    我們知道微軟在Win10中,特別加強了系統(tǒng)的搜索功能,但Win10的搜索的確很難稱得上好用。
    的頭像 發(fā)表于 12-29 15:40 ?3425次閱讀
    如何關閉<b class='flag-5'>win10</b>的網絡搜索功能

    CC Debugger win10 win7驅動及CC Debugger固件免費下載

    本文檔的主要內容詳細介紹的是CC Debugger win10 win7驅動 及CC Debugger固件免費下載。
    發(fā)表于 03-03 08:00 ?71次下載
    <b class='flag-5'>CC</b> Debugger <b class='flag-5'>win10</b> <b class='flag-5'>win</b>7驅動及<b class='flag-5'>CC</b> Debugger固件免費下載

    win10系統(tǒng)激活密鑰key詳細步驟

      Win10一年的免費升級服務已經到期,用戶要使用Win10系統(tǒng),就需要最新Win10密鑰來激活Win10,一般激活Win10系統(tǒng)有兩種方
    發(fā)表于 03-10 11:35 ?6次下載
    <b class='flag-5'>win10</b>系統(tǒng)激活密鑰key詳細步驟

    win10系統(tǒng)新電腦分區(qū)的詳細教程

    win10操作系統(tǒng)是目前最新的操作系統(tǒng)。很多用戶購買的新電腦安裝的都是win10操作系統(tǒng),在使用的時候發(fā)現(xiàn)只有一個c盤分區(qū)。于是就想了解win10系統(tǒng)新電腦分區(qū)怎么操作,那么今天小編就來跟大家分享一下
    的頭像 發(fā)表于 05-01 17:22 ?1.1w次閱讀
    <b class='flag-5'>win10</b>系統(tǒng)新電腦分區(qū)的詳細教程

    win7和win10禁用數(shù)字簽名的教程

    win7和win10禁用數(shù)字簽名的教程
    發(fā)表于 06-10 10:12 ?23次下載

    PICKIT3 WIN10無法識別問題

    通過網上修改注冊表的方式沒有一點效果,后來發(fā)現(xiàn)跟系統(tǒng)可能有關系,換了一個新的WIN10系統(tǒng)就解決了解決方法:換新的win10操作系統(tǒng),測試版本:win10專業(yè)版64位(10.0 19042),在
    發(fā)表于 11-16 20:36 ?4次下載
    PICKIT3 <b class='flag-5'>WIN10</b>無法識別問題

    關于win10驅動安裝失敗的解決

    關于win10驅動安裝失敗的解決現(xiàn)在win10的驅動安裝是學習單片機的路上一大攔路虎,故本人找到了解決win10成功安裝驅動的方法最有效的方法按win+r然后輸入service.msc
    發(fā)表于 12-20 18:45 ?25次下載
    關于<b class='flag-5'>win10</b>驅動安裝失敗的解決

    win10win11哪個好用

    win10win11各有優(yōu)勢,具體哪個更好要根據(jù)實際的應用場景和需求來決定。 首先,從性能方面來看,Win11在單線程、多線程、渲染和3DMark運行時的流暢性都優(yōu)于
    的頭像 發(fā)表于 11-26 14:51 ?4882次閱讀
    RM新时代网站-首页