emcc編譯與部分重要參數選取

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
參考文檔:

emcc是webassemble的編譯器,類似於gcc的作用。

編譯流程

emcc編譯C/C++代碼的流程:

C/C++代碼通過emcc編譯爲字節碼,然後根據不同的目標編譯爲asm.js或wasm。emcc和gcc編譯選項類似,例如-s OPTIONS=VALUE、-O等。另外爲了適應Web環境,emcc增加了一些特有的選項,如–pre-js 、–post-js 等。

emcc選項參數可以通過emcc -help察看
emcc --help

使用例子:

// 不帶-O3, 生成的依賴項比較多一些
emcc temp.cc -o temp.js -s EXPORTED_FUNCTIONS='["_add", "_dec"]'

// 帶-O3, 如果沒有std::cout,則沒有其它依賴項
emcc temp.cc -o temp.js -s EXPORTED_FUNCTIONS='["_add", "_dec"]' -O3

// 編譯樣例,使用ES6,線程中運行,生成單js文件
emcc -O3 -s EXPORT_ES6=1 -s ENVIRONMENT='worker' -s MODULARIZE_INSTANCE=1 -s EXPORT_NAME="test" -s WASM_ASYNC_COMPILATION=0 -s SINGLE_FILE=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_add', '_dec']" test.cc -o test.js

部分重要的選項

// link選項 -O0時顯示的日誌調試信息最完整,生成的js文件的格式名稱也都是易讀的,強烈建議一開始調試時用該選項
// Note: O3 is a good setting for a release build
emcc -Oz > Os > O3 > O2 > O1 > O0 (O0-default)

// WASM=0生成asm.js格式(適用於WebAssembly不支持的情況)
// WASM=1生成包含wasm格式
// WASM=2 asm.js與wasm格式均生成,添加支持判定,優先使用wasm格式。
-s WASM=1 (0/1/2);

// 是否異步加載wasm,主線程需要用異步,worker中可以同步加載 // Whether to compile the wasm asynchronously
-s WASM_ASYNC_COMPILATION=1;

// 設定當前的運行環境,避免生成的js文件中判定環境,並運行不同的代碼
// ‘web’ - the normal web environment.
// ‘worker’ - a web worker environment.
// ‘node’ - Node.js.
// ‘shell’ - a JS shell like d8, js, or jsc.
// e.g., “web,worker”. If this is the empty string, then all runtime environments are supported.
-s ENVIRONMENT=’’;

// 指定內存的大小和是否內存會增長
-s INITIAL_MEMORY=16777216
-s MAXIMUM_MEMORY=16777216
-s ALLOW_MEMORY_GROWTH=0/1

// 導出模塊名稱,常和MODULARIZE_INSTANCE/MODULARIZE配合使用
-s EXPORT_NAME=‘Module’;
// 是否生成模塊instance(單例),返回{}這種格式,並且初始化wasm
-s MODULARIZE_INSTANCE=0(0/1);
// 是否生成模塊,返回function這種格式,模塊可以初始化多個object
-s MODULARIZE=0(0/1);

// 是否導出ES6模式 Export using an ES6 Module export rather than a UMD export. MODULARIZE must be enabled for ES6 exports.
// It might not be supported on old browsers.
-s EXPORT_ES6=0/1

// js中內容儘量多的放入wasm中實現,減少依賴
-s STANDALONE_WASM = 0(0/1);

// If set to 1, embeds all subresources in the emitted file as base64 string literals
-s SINGLE_FILE = 0 (0/1);

// 是否是worker模式 If set to 1, this is a worker library, a special kind of library that is run
-s BUILD_AS_WORKER=0/1

// 設置輸出的名稱:需要提前定義該object={},編譯出的模塊中會填充object函數方法 (用起來有一些問題)
-s EXPORT_NAME = ‘Module’;

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章