Emscripten 編譯器設定

以下是可透過命令列上的 -s 傳遞給 emscripten 的完整設定列表。例如 -sASSERTIONS-sASSERTIONS=0。如需更多詳細資料,請參閱 emcc 文件。

除非另有說明,否則這些設定僅在連結時適用,在編譯期間無效。

ASSERTIONS

我們是否應該加入執行時期斷言。這會影響 JS 和系統程式庫的建置方式。ASSERTIONS == 2 會提供更多執行時期檢查,可能會非常慢。例如,其中包括內部 dlmalloc 斷言。

預設值:1

STACK_OVERFLOW_CHECK

選擇將哪種堆疊粉碎檢查發射到產生的程式碼:使用 ASSERTIONS=1 建置會使 STACK_OVERFLOW_CHECK 預設為 1。由於 ASSERTIONS=1 是 -O0 的預設值,而 -O0 本身是預設的最佳化層級,這表示在沒有任何其他設定的情況下,此設定實際上也會預設為 1。

  • 0:不檢查堆疊溢位。

  • 1:在堆疊頂端加入安全性 Cookie,會在每個刻度結束時和退出時檢查(實際上效能開銷為零)

  • 2:與上述相同,但也會執行 binaryen 通過,將檢查加入到所有堆疊指標指派。效能成本略高。

預設值:0

CHECK_NULL_WRITES

啟用 STACK_OVERFLOW_CHECK 時,我們也會檢查寫入位址零的操作。這有助於偵測 NULL 指標的使用。如果您想要略過此額外檢查(例如,如果您想要從位址零讀取始終傳回零),您可以在此處停用此檢查。停用 STACK_OVERFLOW_CHECK 時,此設定無效。

預設值:true

VERBOSE

設定為 1 時,會在編譯期間產生更詳細的輸出。[一般]

預設值:false

INVOKE_RUN

是否執行 main() 函式。如果您將產生的程式碼嵌入您自己的程式碼中,並在適當的時間自行呼叫 main()(您可以使用 Module.callMain() 來完成,並提供命令列引數的選用參數),請停用此功能。

預設值:true

EXIT_RUNTIME

如果為 0,則 main() 完成時不會結束執行時期(允許程式碼在之後執行,例如從瀏覽器主要事件迴圈)。也不會執行 atexit(),我們可以避免包含用於執行時期關閉的程式碼,例如刷新 stdio 資料流。如果您確實想要在結束時刷新 atexit() 或 stdio 資料流,請將此設定設為 1。此設定在 STANDALONE_WASM 模式下會自動控制。

  • 對於命令(具有 main 函式),這始終為 1

  • 對於反應器(沒有 main 函式),這始終為 0

預設值:false

STACK_SIZE

總堆疊大小。無法擴大堆疊,因此此值必須足夠大,才能滿足程式的需求。如果斷言開啟,我們會在不超過此值時斷言,否則會無訊息地失敗。

預設值:64*1024

MALLOC

要使用哪個 malloc()/free(),從以下選取

  • dlmalloc - 強大的通用 malloc

  • emmalloc - 專為 emscripten 設計的簡單且精簡的 malloc

  • emmalloc-debug - 使用 emmalloc 並加入額外斷言檢查

  • emmalloc-memvalidate - 使用 emmalloc 和斷言 + 堆積一致性檢查。

  • emmalloc-verbose - 使用 emmalloc 和斷言 + 詳細記錄。

  • emmalloc-memvalidate-verbose - 使用 emmalloc 和斷言 + 堆積一致性檢查 + 詳細記錄。

  • mimalloc - 強大的多執行緒配置器。這建議用於具有 malloc() 競爭的大型應用程式,但它更大且使用更多記憶體。

  • none - 未提供任何 malloc() 實作,但您必須自行實作 malloc() 和 free()。

dlmalloc 對於分割記憶體和其他特殊模式是必要的,並且會在這些情況下自動使用。一般而言,如果您不需要這些特殊模式之一,並且如果您未配置非常多的小型物件,則應該使用 emmalloc,因為它較小。否則,如果您配置許多小型物件,則 dlmalloc 通常值得額外的空間。如果您想要它執行的額外安全檢查(例如,注意到其內部資料結構中的中繼資料損毀,而 emmalloc 沒有執行此操作),dlmalloc 也是一個不錯的選擇。

預設值: "dlmalloc"

ABORTING_MALLOC

如果為 1,則當 malloc 可能會失敗時,我們會中止()。這是非標準的行為,但在網路上是合理的,因為我們有必須預先配置的所有固定記憶體,因此 (a) 失敗的 malloc 比其他平台上更有可能發生,而且 (b) 人們需要一種方法來找出初始配置 (INITIAL_MEMORY) 必須有多大。如果將此值設為 0,則在失敗時會取得傳回 NULL (0) 的標準 malloc 行為。

設定 ALLOW_MEMORY_GROWTH 會關閉此功能,因為在該模式下,我們預設為嘗試成長的行為,並在失敗時從 malloc 傳回 0,就像標準系統一樣。但是,您仍然可以設定此旗標來覆寫該行為。這是大部分向後相容的變更。先前,當成長開啟時,此選項會被忽略。目前的行為是成長預設會將其關閉,因此對於從未指定旗標的使用者來說,不會有任何變更。但是,如果您確實指定了,它現在將會生效,但先前不會生效。如果您不希望如此,請停止在連結時間傳遞它。

請注意,此設定不會影響 C++ 中 operator new 的行為。如果停用例外,此函式會在配置失敗時一律中止。如果您希望 new 在失敗時傳回 0,請搭配 std::nothrow 使用。

預設值:true

INITIAL_HEAP

程式可用的初始堆積記憶體數量。這是可透過 sbrkmallocnew 進行動態配置的記憶體區域。

與 INITIAL_MEMORY 不同,此設定允許您程式記憶體的靜態和動態區域獨立成長。在大多數情況下,我們建議使用此設定,而不是 INITIAL_MEMORY。但是,此設定不適用於匯入的記憶體 (例如,當使用動態連結時)。

預設值:16777216

INITIAL_MEMORY

要使用的初始記憶體數量。使用超過此數量的記憶體會導致我們擴展堆積,這在使用類型陣列時可能會很耗費資源:在這種情況下,我們需要將舊堆積複製到新的堆積中。如果設定了 ALLOW_MEMORY_GROWTH,則此初始記憶體數量稍後可以增加;如果沒有設定,則它是最終且總記憶體數量。

依預設,此值是根據 INITIAL_HEAP、STACK_SIZE 以及輸入模組中靜態資料的大小來計算的。

(此選項先前稱為 TOTAL_MEMORY。)

預設值:-1

MAXIMUM_MEMORY

設定 wasm 模組中的最大記憶體大小 (以位元組為單位)。這僅在設定 ALLOW_MEMORY_GROWTH 時相關,因為如果沒有成長,INITIAL_MEMORY 的大小無論如何都是最終記憶體大小。

請注意,此處的預設值為 2GB,這表示依預設,如果您啟用記憶體成長,則我們可以成長到 2GB,但不能更高。2GB 是幾個原因的自然限制

  • 如果最大堆積大小超過 2GB,則指標在 JavaScript 中必須是不帶正負號的,這會增加程式碼大小。除非有人明確選擇使用 >2GB+ 的堆積,否則我們不希望記憶體成長建置更大。

  • 從歷史上來看,沒有任何 VM 支援超過 >2GB+,並且直到最近 (2020 年 3 月) 才開始出現支援。由於支援有限,因此讓使用者選擇使用 >2GB+ 的堆積比較安全,而不是取得可能無法在所有 VM 上運作的建置。

若要使用超過 2GB 的記憶體,請將此設定為更高的值,例如 4GB。

(此選項先前稱為 WASM_MEM_MAX 和 BINARYEN_MEM_MAX。)

預設值:2147483648

ALLOW_MEMORY_GROWTH

如果為 false,當我們嘗試分配超出容量 (INITIAL_MEMORY) 的記憶體時,會中止並顯示錯誤。如果為 true,我們將在執行時無縫且動態地增加記憶體陣列。請參閱 https://code.google.com/p/v8/issues/detail?id=3907,了解 Chrome 中記憶體成長的效能。請注意,成長記憶體表示我們將替換 JS 的類型陣列視圖,因為一旦建立就無法調整其大小。(在 wasm 中,我們可以成長記憶體,但仍需要為 JS 建立新的視圖。)啟用此選項將停用 ABORTING_MALLOC,換句話說,ALLOW_MEMORY_GROWTH 會啟用完全標準的行為,包括 malloc 在失敗時返回 0,以及在必要時從系統分配更多記憶體的能力。

預設值:false

MEMORY_GROWTH_GEOMETRIC_STEP

如果 ALLOW_MEMORY_GROWTH 為 true,此變數指定調整大小時堆積的幾何超額成長率。指定 MEMORY_GROWTH_GEOMETRIC_STEP=0 完全停用堆積的超額成長,或例如 MEMORY_GROWTH_GEOMETRIC_STEP=1.0 在每次成長步驟時將堆積加倍 (+100%)。此值越大,WebAssembly 堆積超額保留的記憶體就越多,以減少因記憶體調整大小而產生的效能頓挫;此值越小,則記憶體保留得越多,代價是堆積成長時會出現更多停頓。(經分析,約為 ~20 毫秒)

預設值:0.20

MEMORY_GROWTH_GEOMETRIC_CAP

指定幾何超額成長大小上限(以位元組為單位)。使用此值來限制幾何成長,使其不超過特定速率。傳遞 MEMORY_GROWTH_GEOMETRIC_CAP=0 以停用上限,並允許無限大小增加。

預設值:96*1024*1024

MEMORY_GROWTH_LINEAR_STEP

如果 ALLOW_MEMORY_GROWTH 為 true 且 MEMORY_GROWTH_LINEAR_STEP == -1,則會使用幾何記憶體超額成長(上述變數)。將 MEMORY_GROWTH_LINEAR_STEP 設定為 WASM 頁面大小 (64KB) 的倍數,例如 16MB,以使用恆定的成長步驟大小來取代幾何超額成長率。當使用 MEMORY_GROWTH_LINEAR_STEP 時,會忽略變數 MEMORY_GROWTH_GEOMETRIC_STEP 和 MEMORY_GROWTH_GEOMETRIC_CAP。

預設值:-1

MEMORY64

要編譯的「架構」。0 表示預設的 wasm32,1 是完整的端對端 wasm64 模式,2 是用於 clang/lld 的 wasm64,但在 Binaryen 中降低為 wasm32(使其可以在 wasm32 引擎上運行,同時在內部使用 i64 指標)。假設 WASM_BIGINT。

注意

在連結和編譯期間均適用

注意

這是一個實驗性設定

預設值:0

INITIAL_TABLE

當使用 MAIN_MODULE 或 SIDE_MODULE 時(而非其他情況),設定表格的初始大小。通常,Emscripten 可以在連結時確定表格的大小,但在 SPLIT_MODULE 模式下,wasm-split 通常需要增加表格,因此,在模組分割後,為檢測建置烘焙到 JS 中的表格大小會太小。這是一個讓使用者指定足夠大的表格大小的權宜之計,該大小在兩個建置中都可以保持一致。此設定可能會隨時移除,不應使用,除非與 SPLIT_MODULE 和動態連結結合使用。

預設值:-1

ALLOW_TABLE_GROWTH

如果為 true,則允許在執行時向表格新增更多函式。這對於動態連結是必要的,並且在該模式下會自動設定。

預設值:false

GLOBAL_BASE

全域資料的起始位置;靜態記憶體的開始。GLOBAL_BASE 為 1024 或更高對於最佳化載入/儲存偏移量很有用,因為它啟用 –low-memory-unused 傳遞。

預設值:1024

TABLE_BASE

表格槽 (函式位址) 的分配位置。此值必須至少為 1,才能為 null 指標保留零槽。

預設值:1

USE_CLOSURE_COMPILER

是否正在此輸出上執行 Closure 編譯

預設值:false

CLOSURE_WARNINGS

已棄用:請改用標準警告標誌。例如,-Wclosure-Wno-closure-Werror=closure。選項:'quiet'、'warn'、'error'。如果設定為 'warn',Closure 警告會列印到控制台。如果設定為 'error',Closure 警告會被視為錯誤,類似於 -Werror 編譯器標誌。

注意

此設定已棄用

預設值:'quiet'

IGNORE_CLOSURE_COMPILER_ERRORS

忽略 Closure 警告和錯誤(例如重複定義)

預設值:false

DECLARE_ASM_MODULE_EXPORTS

如果設定為 1,則每個 wasm 模組匯出都會使用 JavaScript "var" 定義個別宣告。這是簡單且建議的方法。但是,這會增加程式碼大小(特別是當您有許多此類匯出時),如果將此設定為 0,則可以以不安全的方式避免這種情況。在這種情況下,不會為每個匯出建立 "var",而是使用一個迴圈(具有小的恆定程式碼大小,無論您有多少個匯出),將收到的所有匯出寫入全域範圍。這樣做很危險,因為對全域範圍的此類修改可能會混淆外部 JS 最小化工具,並且如果程式碼所在的範圍不是全域範圍(例如,如果您手動將它們封閉在函式範圍中),則事情可能會中斷。

預設值:true

INLINING_LIMIT

如果設定為 1,則會防止內聯。如果為 0,我們將在 LLVM 中正常內聯。這不會影響 Binaryen 中的內聯原則。

注意

僅在編譯期間適用

預設值:false

SUPPORT_BIG_ENDIAN

如果設定為 1,則執行 acorn 傳遞,將每個 HEAP 存取轉換為使用 DataView 來強制執行 HEAP 緩衝區 LE 位元組順序的函式呼叫;這使產生的 JavaScript 可以在 BE 和 LE 機器上運行。(如果為 0,則僅支援 LE 系統)。不會影響產生的 wasm。

預設值:false

SAFE_HEAP

檢查每次對堆積的寫入,例如,這將在原生建置中(例如取消引用 0)導致分段錯誤時提供明確的錯誤。請參閱 runtime_safe_heap.js 以了解執行的實際檢查。將值設定為 1 以測試 Wasm+Wasm2JS 建置的安全行為。將值設定為 2 以僅測試 Wasm 建置的安全行為。(值得注意的是,僅限 Wasm 的建置允許未對齊的記憶體存取。但是請注意,在某些架構上,未對齊的存取可能會非常慢,因此最好還是使用更嚴格的模式 1 來驗證您的程式碼)

預設值:0

SAFE_HEAP_LOG

記錄所有 SAFE_HEAP 操作

預設值:false

EMULATE_FUNCTION_POINTER_CASTS

允許轉換函式指標,將每次不正確類型的呼叫都包裝在執行階段修正中。這會增加額外負荷,通常不應使用。除了使呼叫不會失敗之外,它還會盡力轉換值。我們使用 64 位元 (i64) 來表示值,就好像我們將傳送的值寫入記憶體並從同一記憶體載入接收的類型一樣(使用截斷/擴展/重新解釋)。這表示當類型不符時,模擬值可能不符(在原生方面也是如此 - 這一切都是未定義的行為)。這種方法似乎足以支援 Python,這是推動此功能的主要用例。

預設值:false

EXCEPTION_DEBUG

列印出 emscriptened 程式碼中的例外。

預設值:false

DEMANGLE_SUPPORT

如果為 1,則匯出 demanglestackTrace JS 程式庫函式。

注意

此設定已棄用

預設值:false

LIBRARY_DEBUG

當我們進入程式庫呼叫 (library*.js) 時列印出來。您也可以在執行時取消設定 runtimeDebug 以停止記錄,並在需要時重新設定。在 C++ 中設定它的簡單方法是

emscripten_run_script("runtimeDebug = ...;");

預設值:false

SYSCALL_DEBUG

列印出所有 musl 系統呼叫,包括將其數字索引轉換為字串名稱,這對於除錯可能很方便。(其他系統呼叫未編號,並且已經有明確的名稱;使用 LIBRARY_DEBUG 來取得所有這些呼叫的記錄。)

預設值:false

SOCKET_DEBUG

記錄通訊端/網路資料傳輸。

預設值:false

FS_DEBUG

使用 library_fs.js 中的 trackingDelegate 註冊檔案系統回呼

預設值:false

SOCKET_WEBRTC

除了可以在編譯時透過 "-s" 選項設定外,WEBSOCKET_URL 和 WEBSOCKET_SUBPROTOCOL 設定也可以在執行時透過 Module 物件設定,例如 Module['websocket'] = {subprotocol: 'base64, binary, text'}; Module['websocket'] = {url: 'wss://', subprotocol: 'base64'}; 如果您不想指定子協定,可以將 'subprotocol' 設定為 null。執行階段設定可能很有用,因為它允許應用程式選擇多個不同的服務。

預設值:false

WEBSOCKET_URL

包含 WebSocket URL 前綴 (ws:// 或 wss://) 或完整的 RFC 6455 URL 的字串 - "ws[s]:" "//" 主機 [ ":" 連接埠 ] 路徑 [ "?" 查詢 ]。在 (預設) 僅指定前綴的情況下,URL 將由前綴 + addr + ':' + port 建構,其中 addr 和 port 來自通訊端連線/繫結/接受呼叫。

預設值:'ws://'

PROXY_POSIX_SOCKETS

如果設定為 1,POSIX sockets API 會使用原生橋接程序伺服器,將瀏覽器到原生環境的 socket 呼叫進行代理。

預設值:false

WEBSOCKET_SUBPROTOCOL

一個字串,包含以逗號分隔的 WebSocket 子協定列表,如同 Sec-WebSocket-Protocol 標頭中的呈現方式。如果您不想指定,可以設定為 ‘null’。

預設值:‘binary’

OPENAL_DEBUG

印出我們 OpenAL 實作的偵錯資訊。

預設值:false

WEBSOCKET_DEBUG

如果設定為 1,則印出與 emscripten_web_socket_* 函式在 emscripten/websocket.h 中的呼叫相關的偵錯資訊。如果設定為 2,則額外追蹤透過 sockets 傳輸的位元組。

預設值:false

GL_ASSERTIONS

在 GL 函式庫中新增額外的錯誤情況檢查。可能會影響效能。

預設值:false

TRACE_WEBGL_CALLS

如果啟用,則印出所有 WebGL 內容的 API 呼叫。(非常冗長)

預設值:false

GL_DEBUG

啟用與 WebGL 相關操作更詳細的偵錯輸出。與 LIBRARY_DEBUG 相同,這可以在執行時使用選項 GL.debug 切換。

預設值:false

GL_TESTING

啟用時,在內容中設定 preserveDrawingBuffer,以允許測試運作(但會增加額外負擔)

預設值:false

GL_MAX_TEMP_BUFFER_SIZE

GL 模擬暫存緩衝區的大小

預設值:2097152

GL_UNSAFE_OPTS

啟用 GL 模擬程式碼中一些可能不安全的最佳化

預設值:true

FULL_ES2

強制支援所有 GLES2 功能,而不僅限於 WebGL 友善的子集。

預設值:false

GL_EMULATE_GLES_VERSION_STRING_FORMAT

如果為 true,glGetString() 針對 GL_VERSION 和 GL_SHADING_LANGUAGE_VERSION 將回傳 OpenGL ES 格式的字串「Open GL ES … (WebGL …)」,而不是 WebGL 格式。如果為 false,則會回傳直接的 WebGL 格式字串。將此設定為 true,使 GL 內容在這些版本字串中看起來像 OpenGL ES 內容(會稍微增加程式碼大小),並設定為 false,使 GL 內容看起來像 WebGL 內容,並從輸出中節省一些位元組。

預設值:true

GL_EXTENSIONS_IN_PREFIXED_FORMAT

如果為 true,所有 GL 擴充功能都會以未加前綴的 WebGL 擴充功能格式和加上 GL_ 前綴的桌面/行動 GLES/GL 擴充功能格式進行宣告。

預設值:true

GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS

如果為 true,則新增自動啟用所有 GL 擴充功能以用於 GLES/GL 模擬目的的支援。這會佔用程式碼大小。如果將此設定為 0,則您需要手動啟用您需要的擴充功能。

預設值:true

GL_SUPPORT_SIMPLE_ENABLE_EXTENSIONS

如果為 true,則可以呼叫 emscripten_webgl_enable_extension() 函式以啟用任何 WebGL 擴充功能。如果為 false,為了節省程式碼大小,無法呼叫 emscripten_webgl_enable_extension() 來啟用任何擴充功能 ‘ANGLE_instanced_arrays’、‘OES_vertex_array_object’、‘WEBGL_draw_buffers’、‘WEBGL_multi_draw’、‘WEBGL_draw_instanced_base_vertex_base_instance’ 或 ‘WEBGL_multi_draw_instanced_base_vertex_base_instance’,而是使用在 html5.h 中找到的專用函式 emscripten_webgl_enable_*() 來啟用每個擴充功能。這樣,程式碼大小只會針對實際使用的擴充功能增加。注意:如果將此設定為 0,則 GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS 也必須設定為零。

預設值:true

GL_TRACK_ERRORS

如果設定為 0,Emscripten GLES2->WebGL 轉換層不會追蹤 GLES2 中存在但在 WebGL 中不存在的 GL 錯誤類型。將此設定為 0 可以節省程式碼大小。(建議在開發期間保持為 1)

預設值:true

GL_SUPPORT_EXPLICIT_SWAP_CONTROL

如果為 true,則 GL 內容支援 explicitSwapControl 內容建立標誌。對於不需要它的專案,設定為 0 可以節省少量空間。

預設值:false

GL_POOL_TEMP_BUFFERS

如果為 true,則對 glUniform*fv 和 glUniformMatrix*fv 的呼叫會利用預先配置的常用小型大小暫存緩衝區池,以避免為 WebGL 1 產生暫時性垃圾。停用此功能可以稍微最佳化 GL 函式庫的產生大小,但會以在 WebGL 1 中產生垃圾為代價。如果您僅使用 WebGL 2 並且不支援 WebGL 1,則不需要此功能,並且可以將其關閉。

預設值:true

GL_EXPLICIT_UNIFORM_LOCATION

如果為 true,則啟用對 EMSCRIPTEN_explicit_uniform_location WebGL 擴充功能的支援。請參閱 docs/EMSCRIPTEN_explicit_uniform_location.txt

預設值:false

GL_EXPLICIT_UNIFORM_BINDING

如果為 true,則啟用對 EMSCRIPTEN_uniform_layout_binding WebGL 擴充功能的支援。請參閱 docs/EMSCRIPTEN_explicit_uniform_binding.txt

預設值:false

USE_WEBGL2

已過時。傳遞 -sMAX_WEBGL_VERSION=2 以指定 WebGL 2.0。

預設值:false

MIN_WEBGL_VERSION

指定要指定的最低 WebGL 版本。傳遞 -sMIN_WEBGL_VERSION=1 以啟用指定 WebGL 1,並傳遞 -sMIN_WEBGL_VERSION=2 以捨棄對 WebGL 1.0 的支援

預設值:1

MAX_WEBGL_VERSION

指定要指定的最高 WebGL 版本。傳遞 -sMAX_WEBGL_VERSION=2 以啟用指定 WebGL 2。如果啟用 WebGL 2,則某些 API(EGL、GLUT、SDL)會在未指定版本的情況下,預設建立 WebGL 2 內容。請注意,如果使用者的裝置不支援 WebGL2,即使您同時使用 WebGL1 和 WebGL2 支援進行建置,也不會自動回退到 WebGL1,因為這可能不一定是應用程式想要的。如果您想要這樣的回退,可以嘗試建立具有 WebGL2 的內容,如果失敗,則嘗試建立具有 WebGL1 的內容。

預設值:1

WEBGL2_BACKWARDS_COMPATIBILITY_EMULATION

如果為 true,則在 WebGL 2 內容中模擬某些 WebGL 1 功能,這表示使用 WebGL 1/GLES 2 的應用程式可以初始化 WebGL 2/GLES3 內容,但仍然可以繼續使用 WebGL2/GLES3 中不再支援的 WebGL1/GLES 2 功能。目前,這會在 GLSLES 1.00 shaders 中模擬 GL_EXT_shader_texture_lod 擴充功能,支援未指定大小的內部紋理格式,以及 GL_HALF_FLOAT_OES != GL_HALF_FLOAT 的混合。

預設值:false

FULL_ES3

強制支援所有 GLES3 功能,而不僅限於 WebGL2 友善的子集。這會自動開啟 FULL_ES2 和 WebGL2 支援。

預設值:false

LEGACY_GL_EMULATION

包含模擬各種桌面 GL 功能的程式碼。不完整但在某些情況下很有用,請參閱 http://kripken.github.io/emscripten-site/docs/porting/multimedia_and_graphics/OpenGL-support.html

預設值:false

GL_FFP_ONLY

如果您指定 LEGACY_GL_EMULATION = 1 並且僅在程式碼中使用固定功能管線,則也可以將此設定為 1,以向 GL 模擬層發出信號,表示它可以執行額外的最佳化,因為知道使用者程式碼根本不使用著色器。如果 LEGACY_GL_EMULATION = 0,則此設定沒有任何作用。

預設值:false

GL_PREINITIALIZED_CONTEXT

如果您想在 JS 程式碼中預先建立 WebGL 內容,請將此設定為 1,並將 Module[‘preinitializedWebGLContext’] 設定為預先建立的 WebGL 內容。之後的 WebGL 初始化將使用此 GL 內容進行渲染。

預設值:false

USE_WEBGPU

啟用對 WebGPU 的支援(透過 “webgpu/webgpu.h”)。

預設值:false

STB_IMAGE

啟用 stb-image 的建置,stb-image 是一個用於解碼影像的微型公用領域函式庫,允許在不使用瀏覽器內建解碼器的情況下解碼影像。好處是可以同步完成,但是速度不會像瀏覽器本身那麼快。啟用後,將自動從 IMG_Load 和 IMG_Load_RW 中使用 stb-image。您也可以直接自行呼叫 stbi_* 函式。

預設值:false

GL_DISABLE_HALF_FLOAT_EXTENSION_IF_BROKEN

從 Safari 8(WebGL 在 Safari 中引入)開始,OES_texture_half_float 和 OES_texture_half_float_linear 擴充功能已損壞,並且在用作來源紋理時無法正常運作。請參閱 https://bugs.webkit.org/show_bug.cgi?id=183321https://bugs.webkit.org/show_bug.cgi?id=169999https://stackoverflow.com/questions/54248633/cannot-create-half-float-oes-texture-from-uint16array-on-ipad

預設值:false

GL_WORKAROUND_SAFARI_GETCONTEXT_BUG

解決 Safari WebGL 問題:在 canvas 上成功取得 WebGL 內容後,呼叫 .getContext() 將始終回傳該內容,而與傳遞的 ‘webgl’ 或 ‘webgl2’ 內容版本無關。請參閱 https://bugs.webkit.org/show_bug.cgi?id=222758https://github.com/emscripten-core/emscripten/issues/13295。如果您知道此問題不會影響您,則將此設定為 0 以強制停用此因應措施。

預設值:true

GL_ENABLE_GET_PROC_ADDRESS

如果為 1,則連結 glGetProcAddress() 功能的支援。在 WebGL 中,glGetProcAddress() 會導致大量的程式碼大小和效能影響,因為 WebGL 本身不提供此功能,並且必須進行模擬。不建議使用 glGetProcAddress()。如果您仍然需要使用此功能,例如在移植現有的渲染器時,可以使用 -sGL_ENABLE_GET_PROC_ADDRESS=1 連結以獲得對此功能的支援。

預設值:true

JS_MATH

使用 JavaScript 數學函式,例如 Math.tan。這樣可以節省程式碼大小,因為我們可以避免運送編譯後的 musl 程式碼。但是,它可能會明顯較慢,因為它會呼叫到 JS。由於 JS 數學的規範與 libc 有些不同,並且在瀏覽器之間也可能有所不同,因此也可能產生不同的結果。

預設值:false

POLYFILL_OLD_MATH_FUNCTIONS

如果設定,則啟用 Math.clz32、Math.trunc、Math.imul、Math.fround 的 polyfill。

預設值:false

LEGACY_VM_SUPPORT

設定此值以啟用對舊 JavaScript 引擎的相容性模擬。這可以讓您的程式碼在任何地方都能正常運作的可能性最高,即使是在罕見的舊瀏覽器和 shell 環境中也是如此。具體而言

  • 新增 Math.clz32、Math.trunc、Math.imul、Math.fround 的 polyfill。(-sPOLYFILL_OLD_MATH_FUNCTIONS)

  • 停用 WebAssembly。(必須與 -sWASM=0 配對)

  • 將 MIN_X_VERSION 設定調整為 0,以包含對所有瀏覽器版本的支援。

  • 在 zeroMemory 公用函式中,如果必要,請避免使用 TypedArray.fill。

您也可以個別設定上述選項。

預設值:false

環境

指定 JS 輸出將能夠在哪些執行環境中執行。為了達到最大的可攜性,可以設定為支援所有環境,也可以限制為減少整體程式碼大小。支援的環境如下:

  • ‘web’ - 一般的網路環境。

  • ‘webview’ - 與 web 類似,但在像 Cordova 的 webview 中;在幾乎所有地方都被視為與 “web” 相同

  • ‘worker’ - web worker 環境。

  • ‘node’ - Node.js。

  • ‘shell’ - 像是 d8、js 或 jsc 的 JS shell。

此設定可以是這些環境的逗號分隔列表,例如「web,worker」。如果此為空字串,則支援所有環境。

請注意,此處識別的環境集合與我們在執行階段使用 ENVIRONMENT_IS_* 識別的環境並不完全相同。具體而言,

  • 我們會偵測是否在執行階段使用 pthread,但該設定是針對 workers 而不是主檔案,因此在此處指定沒有意義。

  • webview 目標基本上是 web 的子集。它必須與 web 一起指定 (例如「web,webview」),我們僅在編譯時將其用於程式碼產生,沒有執行階段行為的變更。

請注意,預設情況下我們不包含 ‘shell’ 環境,因為直接使用 d8、js、jsc 極為罕見。

預設值:「web,webview,worker,node」

LZ4

啟用此設定以支援 lz4 壓縮的檔案套件。它們以壓縮形式儲存在記憶體中,並在執行時解壓縮,避免一次在記憶體中儲存整個解壓縮的資料。如果您單獨執行檔案封裝器,仍然需要使用此旗標建置主程式,並將 –lz4 傳遞給檔案封裝器。(您也可以在用戶端上手動壓縮一個,使用 LZ4.loadPackage(),但不建議這樣做。)限制

  • LZ4 壓縮檔案僅在需要時才解壓縮,因此它們不適用於特殊預載作業,例如使用瀏覽器編解碼器預先解碼影像、preloadPlugin 等。

  • LZ4 檔案為唯讀。

預設值:false

DISABLE_EXCEPTION_CATCHING

停用產生實際捕捉例外的程式碼。此停用預設為啟用,因為目前例外狀況的負擔在大小和速度方面都相當高(在未來,wasm 應該會改善這一點)。當例外狀況被停用時,如果實際上發生例外狀況,則不會被捕捉到,並且程式將會停止(因此這不會引入靜默失敗)。

注意

這會移除例外狀況的捕捉,這是速度的主要問題,但您應該使用 -fno-exceptions 建置原始檔,以真正擺脫所有例外狀況程式碼的負擔,因為它可能包含從未捕捉到的拋出例外狀況(例如,僅使用 std::vector 就可能會發生這種情況)。-fno-rtti 也可能有幫助。

此選項與 EXCEPTION_CATCHING_ALLOWED 互斥。

此選項僅適用於 Emscripten (基於 JavaScript) 的例外處理,並不控制原生 Wasm 例外處理。

[編譯+連結] - 在編譯時影響使用者程式碼,在連結時影響系統程式庫

預設值:1

EXCEPTION_CATCHING_ALLOWED

啟用捕捉例外狀況,但僅限於所列出的函式。此選項的作用類似於 DISABLE_EXCEPTION_CATCHING=0 的更精確版本。

此選項與 DISABLE_EXCEPTION_CATCHING 互斥。

此選項僅適用於 Emscripten (基於 JavaScript) 的例外處理,並不控制原生 Wasm 例外處理。

[編譯+連結] - 在編譯時影響使用者程式碼,在連結時影響系統程式庫

預設值:[]

DISABLE_EXCEPTION_THROWING

內部:追蹤 Emscripten 是否應連結至例外狀況拋出 (C++ ‘throw’) 支援程式庫。這不需要直接設定,但請傳遞 -fno-exceptions 以建置停用例外狀況支援。(這基本上是 -fno-exceptions,但在最後連結時間而不是個別的 .cpp 檔案編譯時間檢查)如果程式確實包含拋出程式碼(某些原始檔未使用 -fno-exceptions 編譯),並且在連結時間設定此旗標,那麼您會在未定義的符號上收到錯誤,因為例外狀況拋出程式碼未連結進來。如果是這樣,您應該取消設定此選項(如果您確實想要例外狀況)或修正原始檔的編譯,以便確實不使用任何例外狀況)。TODO(sbc):移至 settings_internal(目前因在測試程式碼中使用而被封鎖)。

此選項僅適用於 Emscripten (基於 JavaScript) 的例外處理,並不控制原生 Wasm 例外處理。

預設值:false

EXPORT_EXCEPTION_HANDLING_HELPERS

將例外狀況訊息列印函式 'getExceptionMessage' 在 JS 程式庫中提供使用,方法是將必要的符號加入 EXPORTED_FUNCTIONS。

這適用於 Emscripten EH 和 Wasm EH。當您從 JS 捕捉例外狀況時,在 Emscripten EH 的情況下,會提供您使用者拋出的值,在 Wasm EH 的情況下,會提供 WebAssembly.Exception 物件。'getExceptionMessage' 在 Emscripten EH 的情況下會接收使用者拋出的值,在 Wasm EH 的情況下會接收 WebAssembly.Exception 物件,這表示在兩種情況下,您都可以將捕捉到的例外狀況直接傳遞給函式。

當與 Wasm EH 搭配使用時,此選項還會在 JS 程式庫中提供這些函式

  • getCppExceptionTag:傳回 C++ 標籤

  • getCppExceptionThrownObjectFromWebAssemblyException:給定一個 WebAssembly.Exception 物件,傳回 Wasm 記憶體中實際使用者拋出的 C++ 物件位址。

設定此選項也會在 JS 程式庫中新增參考計數增加和減少函式 ('incrementExceptionRefcount' 和 'decrementExceptionRefcount'),因為如果您從 JS 捕捉例外狀況,您可能需要手動操作參考計數,以避免記憶體洩漏。您需要執行的動作取決於您使用的 EH 種類 (https://github.com/emscripten-core/emscripten/issues/17115)。

如需使用範例,請參閱 test/test_core.py 中的 test_EXPORT_EXCEPTION_HANDLING_HELPERS。

預設值:false

EXCEPTION_STACK_TRACES

當啟用此選項時,例外狀況將包含堆疊追蹤,並且未捕捉到的例外狀況將在結束時顯示堆疊追蹤。當啟用 ASSERTIONS 時,此選項預設為 true。此選項適用於想要例外狀況堆疊追蹤,但不想要 ASSERTIONS 可能產生的其他負擔的使用者。此選項表示 EXPORT_EXCEPTION_HANDLING_HELPERS。

預設值:false

WASM_EXNREF

發出用於包含 exnref 的新 Wasm 例外狀況處理提案的指令,該提案已於 2023 年 10 月通過。新提案的實作仍在進行中,此功能目前為實驗性功能。

預設值:false

NODEJS_CATCH_EXIT

當呼叫 exit() 時,Emscripten 會拋出 ExitStatus 例外狀況以回溯。如果未啟用此設定,則可能會顯示為最上層的未處理例外狀況。

啟用此設定後,將使用全域 uncaughtException 處理常式來捕捉並處理 ExitStatus 例外狀況。但是,這表示所有其他未捕捉到的例外狀況也會被捕捉到並重新拋出,這並不總是理想的。

預設值:false

NODEJS_CATCH_REJECTION

捕捉 Node 中未處理的拒絕。這僅會影響舊於 15 的 Node 版本。若未設定此項,舊版 Node 將會印出警告,但以零傳回碼結束。啟用此設定後,我們會處理任何未處理的拒絕並拋出例外狀況,這會導致程序立即以非 0 傳回碼結束。Node 15 以上版本不需要此項,因此如果 MIN_NODE_VERSION 為 150000 或以上,此設定預設為 false。

預設值:true

ASYNCIFY

是否支援編譯程式碼中的非同步作業。這使得可以從 C/C++ 中外觀為同步的程式碼中呼叫 JS 函式。

  • 1 (預設):執行 binaryen 的 Asyncify 傳遞以使用 asyncify 轉換程式碼。這會在最後發出一個普通的 wasm 檔案,因此它可以在任何地方運作,但它在程式碼大小和速度方面有顯著的成本。請參閱 https://emscripten.dev.org.tw/docs/porting/asyncify.html

  • 2 (已淘汰):改為使用 -sJSPI

預設值:0

ASYNCIFY_IMPORTS

除了 emscripten 定義的預設匯入(例如 emscripten_sleep)之外,還可以執行非同步作業的匯入。如果您新增更多匯入,您需要在此處提及它們,否則它們將無法運作(在 ASSERTIONS 建置中將會顯示錯誤)。請注意,此清單以前包含預設匯入,這表示您在新增自己的匯入時必須列出它們;預設匯入現在會自動新增。

預設值:[]

ASYNCIFY_IGNORE_INDIRECT

在回溯/重繞期間,間接呼叫是否可以在堆疊上。如果您知道它們不能在堆疊上,則設定此項會非常有幫助,因為否則 asyncify 必須假設間接呼叫可以到達幾乎所有地方。

預設值:false

ASYNCIFY_STACK_SIZE

asyncify 堆疊的大小 - 用於儲存回溯/重繞資訊的區域。此大小必須足夠大,才能儲存呼叫堆疊和區域變數。如果太小,您會看到由於執行「unreachable」指令而導致的 wasm 陷阱。在這種情況下,您應該增加此大小。

預設值:4096

ASYNCIFY_REMOVE

如果提供 Asyncify 移除清單,則即使函式看起來需要,也不會對其中的函式進行檢測。如果您知道整個程式分析不知道的事情,例如如果您知道某些間接呼叫是安全的,並且不會回溯,則這會很有用。但是,如果您取得的清單錯誤,則會發生錯誤(而且在生產版本中,使用者輸入可能會到達您在測試期間遺漏的程式碼路徑,因此很難知道您是否已正確取得此項),因此不建議使用此項,除非您確實知道自己在做什麼,並且需要最佳化每個速度和大小位元。

此清單中的名稱是來自 WebAssembly 名稱區段的名稱。wasm 後端將以人類可讀的形式發出這些名稱,而不是典型的 C++ 名稱修飾。例如,您應該撰寫 Struct::func() 而不是 _ZN6Struct4FuncEv。C 也與 C++ 不同,因為 C 名稱不會以參數結尾;因此 C++ 中的 foo(int) 在 C 中只會顯示為 foo(C++ 具有參數,因為它需要區分多載函式)。如果清單中缺少名稱,您會在主控台中看到警告(這些不是錯誤,因為內嵌等可能會導致變更,這表示單一清單無法適用於 -O0 和 -O1 建置等)。您可以檢查 wasm 二進位檔以尋找實際名稱,可以直接檢查,也可以使用 wasm-objdump 或 wasm-dis 等。

支援簡單的 * 萬用字元比對。

為了避免處理作業系統 Shell 或建置系統逸出中的限制,可以進行以下取代

  • ‘ ‘ -> .,

  • & -> #,

  • , -> ?.

也就是說,函式 “foo(char const*, int&)” 可以在命令列上輸入為 “foo(char.const*?.int#)”

注意:空格是函式簽章的一部分!也就是說,“foo(char const , int &)” 不會與 “foo(char const, int&)” 比對,而 “foo(const char*, int &)” 也不會比對。

預設值:[]

ASYNCIFY_ADD

Asyncify 新增列表中的函式會被加入到檢測函式的清單中,也就是說,即使 asyncify 認為它們不需要被檢測,它們也會被檢測。由於預設情況下,所有內容都會以盡可能安全的方式進行檢測,因此只有在使用 IGNORE_INDIRECT 並使用此列表來修復一些*確實*需要檢測的間接呼叫時,此設定才有用。

關於名稱,包括萬用字元匹配和字元替換,請參閱 ASYNCIFY_REMOVE 的說明。

預設值:[]

ASYNCIFY_PROPAGATE_ADD

如果啟用,檢測狀態將從新增列表傳播,也就是說,從它們的呼叫者,以及它們的呼叫者的呼叫者,依此類推。如果停用,則所有呼叫者都必須手動加入到新增列表中(就像僅限列表一樣)。

預設值:true

ASYNCIFY_ONLY

如果提供了 Asyncify 僅限列表,則*只有*列表中的函式會被檢測。與移除列表一樣,如果設定錯誤,將會破壞您的應用程式。

關於名稱,包括萬用字元匹配和字元替換,請參閱 ASYNCIFY_REMOVE 的說明。

預設值:[]

ASYNCIFY_ADVISE

如果啟用,將會輸出哪些函式已被檢測以及原因。

預設值:false

ASYNCIFY_LAZY_LOAD_CODE

允許延遲程式碼載入:在寫入 emscripten_lazy_load_code() 的地方,我們將暫停執行,載入剩餘的程式碼,然後繼續。

預設值:false

ASYNCIFY_DEBUG

來自 asyncify 內部的執行階段偵錯記錄。

  • 1:最低限度的記錄。

  • 2:詳細的記錄。

預設值:0

ASYNCIFY_EXPORTS

已過時,請改用 JSPI_EXPORTS。

注意

此設定已棄用

預設值:[]

JSPI

使用 VM 支援 JavaScript Promise Integration 提案。這允許非同步操作發生,而無需修改 wasm 的開銷。這目前正在實驗中,因為規格討論仍在進行中,請參閱 https://github.com/WebAssembly/js-promise-integration/ TODO:記錄下列哪些標誌在此模式下仍然相關(例如,不需要 IGNORE_INDIRECT 等)

預設值:0

JSPI_EXPORTS

將會是非同步的已匯出模組函式列表。每個匯出都會傳回一個 Promise,該 Promise 將會使用結果來解析。任何會呼叫非同步匯入(列在 JSPI_IMPORTS 中)的匯出都必須包含在此處。

預設情況下,這包括 main

預設值:[]

JSPI_IMPORTS

可能執行非同步工作的已匯入模組函式列表。在執行非同步工作時,匯入的函式應傳回 Promise

請注意,當使用 --js-library 時,可以在程式庫中使用 <function_name>_async:: true 來標記函式,而不是使用此設定。

預設值:[]

EXPORTED_RUNTIME_METHODS

預設情況下在 Module 上匯出的執行階段元素。我們以前在這裡匯出很多內容,但現在已經全部移除。您應該使用 EXPORTED_RUNTIME_METHODS 來匯出您想要從執行階段匯出的內容。請注意,名稱可能有點誤導,因為這是用於任何 JS 程式庫元素,而不僅僅是方法。例如,我們可以在此列表中加入「FS」來匯出 FS 物件。

預設值:[]

EXTRA_EXPORTED_RUNTIME_METHODS

已過時,請改用 EXPORTED_RUNTIME_METHODS。

注意

此設定已棄用

預設值:[]

INCOMING_MODULE_JS_API

我們關心的 Module 物件中傳入的 JS 值列表。如果值不在這個列表中,則我們不會發出程式碼來檢查您是否在 Module 物件上提供它。例如,如果您有以下內容

var Module = {
  print: (x) => console.log('print: ' + x),
  preRun: [() => console.log('pre run')]
};

那麼 MODULE_JS_API 必須包含 'print' 和 'preRun';如果沒有,則我們可能不會發出程式碼來讀取和使用該值。換句話說,此選項可讓您在編譯時靜態設定將在執行階段提供的 Module JS 值列表,以便編譯器可以更好地最佳化。

將此列表設定為 [],或至少設定為您實際使用的簡短且簡潔的名稱集合,對於減少程式碼大小非常有用。預設情況下,列表包含一組常用的符號。

FIXME:如果我們想要所有內容,這應該只是 0 嗎?

預設值:(多行值,請參閱 settings.js)

CASE_INSENSITIVE_FS

如果設定為非零值,則提供的虛擬檔案系統會被視為不區分大小寫,就像 Windows 和 macOS 一樣。如果設定為 0,則 VFS 會區分大小寫,就像 Linux 一樣。

預設值:false

FILESYSTEM

如果設定為 0,則不會內建任何檔案系統支援。如果您只是進行純粹的計算,而不是讀取檔案或使用任何串流(包括 fprintf 和其他 stdio.h 內容)或任何相關內容,則此設定非常有用。唯一的例外是,printf 和 puts 有部分支援,但有點 hacky。如果編譯器偵測到系統呼叫使用量(這是靜態的)不需要完整的檔案系統,則編譯器會自動設定此值。如果您仍然需要檔案系統支援,請使用 FORCE_FILESYSTEM

預設值:true

FORCE_FILESYSTEM

即使靜態看起來未使用,也會包含完整的檔案系統支援。例如,如果您的 C 程式碼未使用任何檔案,但您包含了一些確實使用了檔案的 JS,則您可能需要此設定。

預設值:false

NODERAWFS

啟用對 NODERAWFS 檔案系統後端的支援。這是一個特殊的後端,因為它會將所有正常的檔案系統存取替換為直接的 Node.js 操作,而無需執行 FS.mount(),而且這個後端只能在 Node.js 上運作。初始工作目錄將與 process.cwd() 相同,而不是 VFS 根目錄。由於此模式直接使用 Node.js 來存取您的作業系統上的真實本機檔案系統,因此程式碼不一定會在作業系統之間移植 - 它將與 Node.js 程式一樣可移植,這表示底層作業系統處理權限和錯誤的方式差異等等可能會很明顯。

預設值:false

NODE_CODE_CACHING

這會將編譯的 wasm 模組儲存在名為 $WASM_BINARY_NAME.$V8_VERSION.cached 的檔案中,並在後續執行時載入。這會快取 node 中來自 v8 的已編譯 wasm 程式碼,這會在後續執行時節省編譯,使其啟動速度更快。node 中使用的 V8 版本包含在快取名稱中,以便我們不會嘗試從另一個版本載入快取程式碼,這會靜默失敗(它似乎載入正常,但我們實際上會重新編譯)。

  • 已知唯一確定可運作的版本是 node 12.9.1,因為這已經回歸,請參閱 https://github.com/nodejs/node/issues/18265#issuecomment-622971547

  • 如前所述,.cached 檔案的預設位置與 wasm 二進位檔並列。如果該檔案位於唯讀目錄中,您可能需要將它們放在其他位置。您可以使用 locateFile() 掛鉤來執行此操作。

預設值:false

EXPORTED_FUNCTIONS

明確匯出的符號。這些符號會透過 LLVM 無用程式碼消除保持作用,並且即使在(在「Module」上)執行 closure 編譯器之後,也可以在產生的程式碼外部存取。在此處列出的原生符號需要 _ 前綴。

預設情況下,如果未在命令列上指定此設定,則會隱式匯出 _main 函式。在 STANDALONE_WASM 模式下,預設匯出是 __start(如果指定了 –no-entry,則為 __initialize)。

JS 程式庫符號也可以加入此列表(不含開頭的 $)。

預設值:[]

EXPORT_ALL

如果為 true,我們會將 JS 中存在的所有符號匯出到 Module 物件上。這不會影響將會存在哪些符號 - 它不會阻止 DCE 或導致任何內容包含在連結中。它只會對最終出現在 JS 檔案中的所有 X 執行 Module['X'] = X;。這對於在 Module 上匯出 JS 程式庫函式非常有用,例如動態連結。

預設值:false

EXPORT_KEEPALIVE

如果為 true,我們會將 JS 中存在的符號匯出到 Module 物件上。它只會執行 Module['X'] = X;

預設值:true

RETAIN_COMPILER_SETTINGS

記住這些設定的值,並使其可透過 getCompilerSetting 和 emscripten_get_compiler_setting 存取。若要查看保留了哪些內容,請在產生的程式碼中尋找 compilerSettings。

預設值:false

DEFAULT_LIBRARY_FUNCS_TO_INCLUDE

我們預設包含的 JS 程式庫元素(在 JS 中實作的 C 函式)。如果您想要確定 JS 編譯器會包含某些內容,請將其加入此處。例如,如果您未使用 C 中的某些 emscripten_* C API 呼叫,但您想要從 JS 呼叫它,請將其加入此處。請注意,名稱可能有點誤導,因為這是用於任何 JS 程式庫元素,而不僅僅是函式。例如,您可以將「$Browser」加入此列表來包含 Browser 物件。

如果您想要同時包含和匯出 JS 程式庫符號,只需將其加入 EXPORTED_FUNCTIONS 就足夠了,而無需同時將其加入 DEFAULT_LIBRARY_FUNCS_TO_INCLUDE。

預設值:[]

INCLUDE_FULL_LIBRARY

包含所有 JS 函式庫函式,而不是 DEFAULT_LIBRARY_FUNCS_TO_INCLUDE 的總和 + 任何產生的程式碼所使用的函式。當動態載入(即 dlopen)使用主要模組中未使用之執行階段函式庫函式的模組時,這是必要的。請注意,這僅適用於 JS 函式庫,*不適用於* C。您需要主檔案包含所有需要的 C 函式庫。例如,如果模組使用 malloc 或 new,您也需要在主檔案中使用這些函式,以引入 malloc 供模組使用。

預設值:false

可重定位

如果設定為 1,我們會從 LLVM 後端發出可重定位的程式碼;全域變數和函式指標都會被偏移(分別以 gb 和 fp 作為偏移量)。會自動為 SIDE_MODULE 或 MAIN_MODULE 設定。

注意

在連結和編譯期間均適用

預設值:false

主模組

主模組是以允許我們在執行階段將其連結到側模組的方式編譯的檔案。

  • 1:一般主模組。

  • 2:DCE (Dead Code Elimination) 後的主模組。我們會正常消除死碼。如果側模組需要主模組中的某些內容,您有責任確保它保持啟用狀態。

注意

在連結和編譯期間均適用

預設值:0

側模組

對應於 MAIN_MODULE (也支援模式 1 和 2)

注意

在連結和編譯期間均適用

預設值:0

執行階段連結函式庫

已棄用,請改為直接在命令列上列出共享函式庫。

注意

此設定已棄用

預設值:[]

建置為 Worker

如果設定為 1,這會是一個 Worker 函式庫,一種在 Worker 中執行的特殊函式庫。請參閱 emscripten.h

預設值:false

代理到 Worker

如果設定為 1,我們會將專案建置為將在 Worker 中執行的 js 檔案,並產生一個 html 檔案,將輸入和輸出代理到該 Worker/從該 Worker 代理。

預設值:false

代理到 Worker 的檔案名稱

如果設定,則為主執行緒載入的腳本檔案名稱。如果您的專案不會立即執行 emscripten 產生的主腳本,而是在之前進行一些設定,這會很有用

預設值:''

代理到 Pthread

如果設定為 1,則會在實際的 main() 之間編譯一個小的 stub main(),該 stub main() 會呼叫 pthread_create() 以在 pthread 中執行應用程式的 main()。如果應用程式願意,也可以手動執行此操作,此選項僅為方便起見而提供。

main() 執行的 pthread 在各方面都是一個普通的 pthread,唯一的區別是它的堆疊大小與主執行緒通常擁有的堆疊大小相同,即 STACK_SIZE。這使得在 PROXY_TO_PTHREAD 和非 PROXY_TO_PTHREAD 模式之間切換變得容易,main() 始終獲得相同的堆疊大小。

如果存在 Module['canvas'],並且啟用 OFFSCREENCANVAS_SUPPORT,則會代理此選項。 這是必須的,因為這是唯一一次機會 - 這個瀏覽器主執行緒會執行該執行緒上發生的唯一 pthread_create 呼叫,因此這是將畫布從那裡傳輸的唯一機會。

預設值:false

可連結

如果設定為 1,則此檔案可以與其他檔案連結,無論是作為共享函式庫還是呼叫共享函式庫的主檔案。為啟用此功能,我們不會內部化所有符號並刪除未使用的符號,換句話說,我們不會刪除未使用的函式和全域變數,它們可能會被我們連結的另一個模組使用。

MAIN_MODULE 和 SIDE_MODULE 都暗示了這一點,因此通常不需要明確設定它。請注意,MAIN_MODULE 和 SIDE_MODULE 模式 2 *不*設定此選項,以便我們仍然對它們執行正常的 DCE,在這種情況下,您必須使用匯出自行保持相關內容的啟用狀態。

預設值:false

嚴格

Emscripten「嚴格」建置模式:捨棄任何已棄用的建置選項的支援。設定環境變數 EMCC_STRICT=1 或傳遞 -sSTRICT,以測試程式碼庫是否以向前相容的方式良好建置。此功能啟用的變更

  • 未定義 C 巨集 EMSCRIPTEN(__EMSCRIPTEN__ 始終存在,並且是正確的用法)。

  • 已啟用 STRICT_JS。

  • 已停用 IGNORE_MISSING_MAIN。

  • 已停用 AUTO_JS_LIBRARIES。

  • 已停用 AUTO_NATIVE_LIBRARIES。

  • 已停用 DEFAULT_TO_CXX。

  • 預設情況下,USE_GLFW 設定為 0 而非 2。

  • 已停用 ALLOW_UNIMPLEMENTED_SYSCALLS。

  • 預設情況下,INCOMING_MODULE_JS_API 設定為空。

注意

在連結和編譯期間均適用

預設值:false

忽略遺失的 main

允許程式在有或沒有 main 符號的情況下連結。如果停用此功能,則必須提供 main 符號,或透過傳遞 --no-entry 或不包含 _main 的 EXPORTED_FUNCTIONS 清單來明確選擇退出。

預設值:true

嚴格 JS

"use strict;" 新增至產生的 JS

預設值:false

未定義符號時發出警告

如果設定為 1,我們會在 library_*.js 檔案未解析的任何未定義符號上發出警告。請注意,在大型專案中,當您知道不會實際呼叫哪些內容時(並且不想弄亂現有的建置系統),通常不會實作所有內容,並且函式可能會在稍後(例如在 --pre-js 中)實作,因此您可能想要使用 -s WARN_ON_UNDEFINED_SYMBOLS=0 建置,以停用煩人的警告。另請參閱 ERROR_ON_UNDEFINED_SYMBOLS。也會報告在 EXPORTED_FUNCTIONS 中列出的任何未定義符號。

預設值:true

未定義符號時發生錯誤

如果設定為 1,我們會在任何未定義符號上提供連結時錯誤(請參閱 WARN_ON_UNDEFINED_SYMBOLS)。若要允許在連結時使用未定義的符號,請將其設定為 0,在這種情況下,如果呼叫未定義的函式,則會發生執行階段錯誤。也會報告在 EXPORTED_FUNCTIONS 中列出的任何未定義符號。

預設值:true

小型 XHR 區塊

在 Web Worker 中,為二進位同步 XHR 使用小型區塊大小。用於測試。請參閱 runner.py 和 library.js 中的 test_chunked_synchronous_xhr。

預設值:false

無頭

如果為 1,則會包含嘗試「偽造」瀏覽器環境的 shim 程式碼,以便讓您在 shell 中執行瀏覽器程式(例如,使用 SDL)。顯然不會呈現任何內容,但如果實際呈現不是問題,這對於基準測試和偵錯會很有用。請注意,shim 程式碼非常不完整 - 很難偽造整個瀏覽器! - 因此請不要期望它能很好地工作。

預設值:false

確定性

如果為 1,我們會強制 Date.now()、Math.random 等傳回確定性的結果。這也會嘗試使跨機器和環境的執行具有確定性,例如,不會根據瀏覽器的語言設定執行任何不同的操作(這表示您可以在不同的瀏覽器中或在瀏覽器和 node 中獲得不同的結果)。適用於比較建置以進行偵錯(而不是其他用途)。

預設值:false

模組化

預設情況下,我們會以直接的方式將所有程式碼發出到輸出 .js 檔案中。這表示如果您在網頁的 script 標籤中載入該檔案,它將使用全域範圍。設定 MODULARIZE 後,我們改為將程式碼包裝在一個函式中,該函式會傳回一個 promise。當執行編譯程式碼安全時,promise 會使用模組執行個體進行解析,類似於 onRuntimeInitialized 回呼。使用 MODULARIZE 時,您不需要使用 onRuntimeInitialized 回呼。

(如果 WASM_ASYNC_COMPILATION 關閉,即如果編譯是*同步的*,那麼傳回 Promise 將沒有意義,而是會傳回 Module 物件本身,該物件已準備好使用。)

函式的預設名稱是 Module,但可以使用 EXPORT_NAME 選項進行變更。我們建議將其重新命名為更典型的工廠函式名稱,例如 createModule

您可以這樣使用工廠函式

const module = await EXPORT_NAME();

或者

let module;
EXPORT_NAME().then(instance => {
  module = instance;
});

工廠函式接受 1 個參數,一個包含模組執行個體預設值的物件

const module = await EXPORT_NAME({ option: value, ... });

請注意括號 - 我們正在呼叫 EXPORT_NAME 以實例化模組。這可讓您建立模組的多個執行個體。

請注意,在 MODULARIZE 模式下,我們*不*會尋找全域 Module 物件以取得預設值。預設值必須作為參數傳遞給工廠函式。

MINIMAL_RUNTIME 模式中提供的預設 .html shell 檔案會自動建立單例執行個體,以在頁面上執行應用程式。(請注意,它不使用先前提到的 Promise API,因此如果您告訴 emcc 發出 .html 輸出,則 Promise 的程式碼甚至不會在 .js 檔案中發出。)傳統執行階段模式提供的預設 .html shell 檔案僅與 MODULARIZE=0 模式相容,因此在使用傳統執行階段進行建置時,您應提供自己的 html shell 檔案,以便在使用 MODULARIZE=1 進行建置時執行實例化。(如需更多詳細資訊,請參閱https://github.com/emscripten-core/emscripten/issues/7950

如果您新增 --pre-js 或 --post-js 檔案,它們將包含在工廠函式中,並與其餘發出的程式碼一起,以便與其一起最佳化。

如果您想在所有產生的程式碼(包括工廠函式)之外包含程式碼,可以使用 –extern-pre-js 或 –extern-post-js。雖然 –pre-js 和 –post-js 在非 MODULARIZE 模式下恰好可以做到這一點,但它們的預期用途是新增與其餘發射程式碼一起最佳化的程式碼,以實現更好的死碼消除和最小化。

預設值:false

EXPORT_ES6

使用 ES6 模組匯出而不是 UMD 匯出。必須啟用 MODULARIZE 才能使用 ES6 匯出,如果尚未設定,則會隱式啟用。

如果輸出後綴設定為 ‘mjs’,則會隱式啟用此選項。

預設值:false

USE_ES6_IMPORT_META

使用 ES6 模組相對匯入功能 ‘import.meta.url’ 來自動偵測 WASM 模組路徑。它可能在舊瀏覽器/工具鏈上不受支援。當目標為 Node.js 時(-sENVIRONMENT=*node*),此設定可能無法停用。

預設值:true

EXPORT_NAME

在沒有標準化模組載入系統的環境(例如瀏覽器和 SM shell)中,將模組匯出的全域變數。

預設值:'Module'

DYNAMIC_EXECUTION

當設定為 0 時,我們不會發出 eval() 和 new Function(),這會停用某些功能(如果嘗試使用會導致執行階段錯誤),但允許發出的程式碼在不允許動態程式碼執行的位置(Chrome 套件應用程式、具有特權的 Firefox 應用程式等)中被接受。在開發針對具有特權或經過認證的執行環境的 Emscripten 應用程式時,請傳遞此標誌,詳細資訊請參閱 Firefox 內容安全策略 (CSP) 網頁:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src,特別是 ‘unsafe-eval’ 和 ‘wasm-unsafe-eval’ 原則。

當設定此標誌時,以下功能(連結器標誌)不可用

  • RELOCATABLE:函式 loadDynamicLibrary 需要 eval()。

當某些功能需要時,可能會退回到較慢的程式碼路徑:Embind:使用 eval() 來即時編譯函式以提高速度。

此外,當設定 DYNAMIC_EXECUTION=0 時,以下 Emscripten 執行階段函式不可用,嘗試呼叫它們會擲回例外

  • emscripten_run_script(),

  • emscripten_run_script_int(),

  • emscripten_run_script_string(),

  • dlopen(),

  • 函式 ccall() 和 cwrap() 仍然可用,但它們僅限於呼叫事先在 Module 物件中匯出的函式。

當設定 -sDYNAMIC_EXECUTION=2 時,嘗試呼叫 eval() 會降級為警告,而不是擲回例外。

預設值:1

BOOTSTRAPPING_STRUCT_INFO

我們是否處於產生 struct_info 引導階段

預設值:false

EMSCRIPTEN_TRACING

新增一些對 emscripten 追蹤 API 的呼叫

注意

在連結和編譯期間均適用

預設值:false

USE_GLFW

指定要連結的 GLFW 版本。只有在您連結 GLFW 程式庫時才相關。有效選項為 GLFW2 的 2 和 GLFW3 的 3。

預設值:0

WASM

是否使用將程式碼編譯為 WebAssembly。將此設定為 0 以編譯為 JS 而不是 wasm。

指定 -sWASM=2 以同時以 WebAssembly 和 JavaScript 為目標。在該建置模式下,會產生兩個檔案 a.wasm 和 a.wasm.js,並且如果瀏覽器/shell 支援,則會在執行階段載入 WebAssembly 檔案。否則,將使用 .wasm.js 後備。

如果啟用 WASM=2,且瀏覽器無法編譯 WebAssembly 模組,則頁面將以 Wasm2JS 模式重新載入。

預設值:1

STANDALONE_WASM

STANDALONE_WASM 表示我們希望發出一個可以在沒有 JavaScript 的情況下執行的 wasm 檔案。該檔案將盡可能使用標準 API(例如 wasi)來實現這一點。

此選項不能保證 wasm 可以單獨使用 - 如果您使用沒有非 JS 替代方案的 API,我們仍然會使用這些 API(例如,撰寫本文時的 OpenGL)。這讓您可以查看缺少哪些 API,以及如果您要為自訂 wasi 嵌入編譯,請將這些 API 新增到您的嵌入中。

我們仍然可以使用此標誌發出 JS,但 JS 應該只是在 Web 或 Node.js 上執行 wasm 的一種便利方式,並且您可以在沒有該 JS 的情況下單獨執行 wasm(再次強調,除非您使用沒有非 JS 替代方案的 API),例如在 wasmer 或 wasmtime 等 wasm 執行階段中。

請注意,即使沒有此選項,我們也會盡可能嘗試使用 wasi 等系統呼叫。此選項更改的是,即使這意味著要犧牲 JS 大小,我們也會這樣做。例如,當設定此選項時,我們不會匯入 Memory - 匯入它對 JS 很有用,這樣 JS 可以在 wasm 甚至尚未載入之前就開始使用它,但在 wasi 和其他僅限 wasm 的環境中,預期是在 wasm 本身中建立記憶體。這樣做會阻止某些可能的 JS 最佳化,因此我們僅在此標誌後執行此操作。

當設定此標誌時,我們不會使 JS 介面合法化,因為 wasm 旨在在 wasm VM 中執行,它可以直接處理 i64。如果我們使其合法化,則 wasm VM 將無法識別 API。但是,這表示如果您使用具有 i64 的 JS API,則發出的可選 JS 將不會執行。您可以使用 WASM_BIGINT 選項,透過將 BigInt 用於 i64 來避免該問題,這表示我們不需要為 JS 使其合法化(但這需要足夠新的 JS VM)。

預設情況下,獨立建置需要 main 進入點。如果您想要建置程式庫(也稱為 reactor),您可以傳遞 --no-entry

預設值:false

BINARYEN_IGNORE_IMPLICIT_TRAPS

是否在 binaryen 中最佳化時忽略隱含陷阱。隱含陷阱是指在越界載入或除以 0 或 rem 時發生的陷阱等。設定此選項後,最佳化器會假設載入不會陷入陷阱,因此它們根本沒有任何副作用。這通常安全,因為您可能會在條件後面進行載入,以確保其安全;但如果假設載入沒有副作用,則可以無條件執行。因此,此選項通常在大型且複雜的專案上沒有用處,但在小型且足夠簡單的程式碼庫中,它可能可以稍微減少程式碼大小。

預設值:false

BINARYEN_EXTRA_PASSES

要在 binaryen 最佳化器中執行的額外傳遞的逗號分隔清單。設定此選項不會覆寫/取代預設傳遞。它會附加在傳遞清單的末尾。

預設值:""

WASM_ASYNC_COMPILATION

是否非同步編譯 wasm,這樣效率更高,且不會封鎖主執行緒。目前除了最小的模組之外,所有模組都需要在 Chrome 中執行。

(此選項以前稱為 BINARYEN_ASYNC_COMPILATION)

預設值:true

DYNCALLS

如果設定為 1,則 dynCall() 和 dynCall_sig() API 可供呼叫者使用。

預設值:false

WASM_BIGINT

WebAssembly 與 JavaScript BigInt 的整合。啟用後,我們不需要將 i64 合法化為 i32 對,因為 wasm VM 將在使用了 i64 的地方使用 BigInt。如果存在 WASM_BIGINT,則預設的最低支援瀏覽器版本將增加到支援 BigInt 的最低版本。

預設值:false

EMIT_PRODUCERS_SECTION

WebAssembly 定義了一個「生產者區段」,編譯器和工具可以在其中註解自己,而 LLVM 預設會發出此區段。Emscripten 會將其剝除,使其發出,因為它會增加程式碼大小,而且有些使用者可能不希望將其工具的資訊包含在他們的建置中,因為出於隱私或安全性原因,請參閱 https://github.com/WebAssembly/tool-conventions/issues/93

預設值:false

EMIT_EMSCRIPTEN_LICENSE

在 JS 輸出中發出 emscripten 授權資訊。

預設值:false

LEGALIZE_JS_FFI

是否透過包裝 JS FFI 介面(匯入/匯出)來自動將 i64 降級為 i32 並將 f32 提升為 f64,以使其合法化。為了與 JavaScript 介面,這是必要的。對於非網頁/非 JS 嵌入,最好將此設定為 0。

注意

此設定已棄用

預設值:true

USE_SDL

指定要連結的 SDL 版本。1(預設值)是 1.3,它是在 JS 中實作的 2 是 emscripten-ports 上 SDL C 程式碼的埠。當 AUTO_JS_LIBRARIES 設定為 0 時,此預設為 0,且不會連結 SDL。使用埠的替代語法:–use-port=sdl2

注意

在連結和編譯期間均適用

預設值:0

USE_SDL_GFX

指定要連結的 SDL_gfx 版本。必須與 USE_SDL 相符

注意

在連結和編譯期間均適用

預設值:0

USE_SDL_IMAGE

指定要連結的 SDL_image 版本。必須與 USE_SDL 相符

注意

在連結和編譯期間均適用

預設值:1

USE_SDL_TTF

指定要連結的 SDL_ttf 版本。必須與 USE_SDL 相符

注意

在連結和編譯期間均適用

預設值:1

USE_SDL_NET

指定要連結的 SDL_net 版本。必須與 USE_SDL 相符

注意

在連結和編譯期間均適用

預設值:1

USE_ICU

1 = 使用 emscripten-ports 中的 icu。替代語法:–use-port=icu

注意

在連結和編譯期間均適用

預設值:false

USE_ZLIB

1 = 使用 emscripten-ports 中的 zlib。替代語法:–use-port=zlib

注意

在連結和編譯期間均適用

預設值:false

USE_BZIP2

1 = 使用 emscripten-ports 中的 bzip2。替代語法:–use-port=bzip2

注意

在連結和編譯期間均適用

預設值:false

USE_GIFLIB

1 = 使用 emscripten-ports 中的 giflib。替代語法:–use-port=giflib

注意

在連結和編譯期間均適用

預設值:false

USE_LIBJPEG

1 = 使用 emscripten-ports 中的 libjpeg。替代語法:–use-port=libjpeg

注意

在連結和編譯期間均適用

預設值:false

USE_LIBPNG

1 = 使用 emscripten-ports 中的 libpng。 替代語法:–use-port=libpng

注意

在連結和編譯期間均適用

預設值:false

USE_REGAL

1 = 使用 emscripten-ports 中的 Regal。 替代語法:–use-port=regal

注意

在連結和編譯期間均適用

預設值:false

USE_BOOST_HEADERS

1 = 使用 emscripten-ports 中的 Boost 標頭檔。 替代語法:–use-port=boost_headers

注意

在連結和編譯期間均適用

預設值:false

USE_BULLET

1 = 使用 emscripten-ports 中的 bullet。 替代語法:–use-port=bullet

注意

在連結和編譯期間均適用

預設值:false

USE_VORBIS

1 = 使用 emscripten-ports 中的 vorbis。 替代語法:–use-port=vorbis

注意

在連結和編譯期間均適用

預設值:false

USE_OGG

1 = 使用 emscripten-ports 中的 ogg。 替代語法:–use-port=ogg

注意

在連結和編譯期間均適用

預設值:false

USE_MPG123

1 = 使用 emscripten-ports 中的 mpg123。 替代語法:–use-port=mpg123

注意

在連結和編譯期間均適用

預設值:false

USE_FREETYPE

1 = 使用 emscripten-ports 中的 freetype。 替代語法:–use-port=freetype

注意

在連結和編譯期間均適用

預設值:false

USE_SDL_MIXER

指定要連結的 SDL_mixer 版本。不一定要與 USE_SDL 相符,但最好是這樣。

注意

在連結和編譯期間均適用

預設值:1

USE_HARFBUZZ

1 = 使用來自 harfbuzz 上游的 harfbuzz。 替代語法:–use-port=harfbuzz

注意

在連結和編譯期間均適用

預設值:false

USE_COCOS2D

3 = 使用 emscripten-ports 中的 cocos2d v3。 替代語法:–use-port=cocos2d

注意

在連結和編譯期間均適用

預設值:0

USE_MODPLUG

1 = 使用 emscripten-ports 中的 libmodplug。 替代語法:–use-port=libmodplug

注意

在連結和編譯期間均適用

預設值:false

SDL2_IMAGE_FORMATS

要在 SDL2_image 中支援的格式。有效值:bmp, gif, lbm, pcx, png, pnm, tga, xcf, xpm, xv

預設值:[]

SDL2_MIXER_FORMATS

要在 SDL2_mixer 中支援的格式。有效值:ogg, mp3, mod, mid

預設值:[“ogg”]

USE_SQLITE3

1 = 使用 emscripten-ports 中的 sqlite3。替代語法:–use-port=sqlite3

注意

在連結和編譯期間均適用

預設值:false

SHARED_MEMORY

如果為 1,則目標編譯一個共享的 Wasm 記憶體。[編譯+連結] - 在編譯時影響使用者程式碼,並在連結時影響系統函式庫。

預設值:false

WASM_WORKERS

如果為 1,則啟用對 Wasm Workers 的支援。Wasm Workers 允許應用程式使用基於 Wasm SharedArrayBuffer + Atomics API 之上的輕量級、特定於 Web 的 API 來建立執行緒。啟用後,將生成一個新的建置輸出檔案 a.ww.js 以引導 Wasm Worker JS 內容。如果為 2,則啟用對 Wasm Workers 的支援,但不使用單獨的 a.ww.js 檔案。這可以簡化建置的部署,但會有一個缺點,即產生的建置將不再符合 csp-eval 標準。[編譯+連結] - 在編譯時影響使用者程式碼,並在連結時影響系統函式庫。

預設值:0

AUDIO_WORKLET

如果為 true,則啟用以 Wasm Web Audio AudioWorklets 為目標。請查看 site/source/docs/api_reference/wasm_audio_worklets.rst 中的完整文件。

預設值:0

WEBAUDIO_DEBUG

如果為 true,則啟用 Web Audio 後端的深度偵錯。

預設值:0

PTHREAD_POOL_SIZE

在網頁瀏覽器中,當主瀏覽器執行緒正在執行 JS/Wasm 程式碼時,無法建立 Worker,但主執行緒必須定期返回瀏覽器事件迴圈,以便進行 Worker 初始化。這表示,從主瀏覽器執行緒呼叫時,pthread_create() 本質上是一個非同步操作,並且主執行緒必須重複返回 JS 事件迴圈,才能實際啟動執行緒。如果您的應用程式需要能夠同步建立新執行緒,您可以透過指定 -sPTHREAD_POOL_SIZE=x 來預先建立執行緒池,在這種情況下,指定數量的 Worker 將在應用程式啟動前預先載入到池中,然後可以同步建立那麼多執行緒。請注意,此設定是一個字串,並且將會以字串形式(直接,沒有額外的引號)輸出到 JS 程式碼中,因此如果您將其設定為 '5',則會在池中使用 5 個 Worker,依此類推。將其作為字串的好處是,您可以將其設定為類似 'navigator.hardwareConcurrency' 的值(這將會使用瀏覽器回報的核心數量,並且這也是您可以取得與核心數量相等的執行緒池的正確方法)。[連結] - 在連結時影響產生的 JS 執行階段程式碼

預設值:0

PTHREAD_POOL_SIZE_STRICT

通常,即使池為空,應用程式也可以建立新執行緒。當應用程式在嘗試透過 pthread_join 或任何其他阻擋式基本操作來阻擋執行緒之前,跳出到 JS 事件迴圈時,將會建立一個額外的 Worker 並執行執行緒回呼。但是,跳出到事件迴圈需要對程式碼進行自訂修改,以使其適應 Web,而這並非現成的應用程式可以運作的方式。那些沒有任何修改的應用程式很可能會死鎖。此設定可確保,它們至少會收到 C / C++ 端可以優雅處理的執行階段 EAGAIN 錯誤,而不是冒著死鎖的風險。值

  • 0 - 停用關於執行緒池耗盡的警告

  • 1 - 啟用關於執行緒池耗盡的警告(預設)

  • 2 - 將執行緒池耗盡設為硬性錯誤

預設值:1

PTHREAD_POOL_DELAY_LOAD

如果您的應用程式不需要同步建立執行緒的功能,但仍希望透過預熱 Worker 池來加快初始執行緒啟動時間,您可以透過 -sPTHREAD_POOL_SIZE=x 指定池的大小,然後再指定 -sPTHREAD_POOL_DELAY_LOAD,這將導致執行階段不會在啟動時等待 Worker 池完成載入。相反地,執行階段將會立即啟動,並且 Worker 池將會在背景中非同步地並行啟動。這樣可以縮短 pthread_create() 呼叫實際啟動執行緒所需的時間,而不會實際減慢主要應用程式的啟動速度。如果 PTHREAD_POOL_DELAY_LOAD=0(預設),則執行階段會在執行 main() 之前等待池啟動。如果您確實需要在建立的執行緒上同步等待(例如,透過 pthread_join),您必須在這樣做之前等待 Module.pthreadPoolReady Promise,否則您很可能會遇到死鎖。[連結] - 在連結時影響產生的 JS 執行階段程式碼

預設值:false

DEFAULT_PTHREAD_STACK_SIZE

新建立的 pthread 要使用的預設堆疊大小。如果未設定,則預設為 STACK_SIZE(預設為 64k)。也可以使用 pthread_attr_setstacksize() 在執行階段設定。請注意,wasm 控制流程堆疊與此堆疊是分開的。此堆疊僅包含某些函式本機變數,例如那些已取得位址的變數,或是太大而無法作為 wasm 程式碼中的本機變數的變數。

預設值:0

PTHREADS_PROFILING

在使用 –threadprofiler 建置時為 True

預設值:false

ALLOW_BLOCKING_ON_MAIN_THREAD

在主執行緒上呼叫 pthread_join 或 pthread_cond_wait 是很危險的,因為這樣做可能會在 Web 上造成死鎖(而且它使用忙碌等待,這很耗費資源)。請參閱 https://emscripten.dev.org.tw/docs/porting/pthreads.html#blocking-on-the-main-browser-thread。在未來,預設可能會將其設定為 0;目前,這只會在主控台中發出警告。

預設值:true

PTHREADS_DEBUG

如果為 true,則加入偵錯追蹤以診斷與 pthreads 相關的問題。

預設值:false

EVAL_CTORS

這會嘗試在編譯時評估程式碼。主要用例是評估全域建構函式,也就是在 main() 之前執行的那些函式,但也可以評估 main() 本身或其部分內容。以這種方式評估程式碼可以避免在執行階段進行工作,因為它會將執行的結果套用至記憶體和全域變數等等,「快照」wasm,然後在載入時從那裡執行。

當它看到無法在編譯時評估的內容時,例如對匯入的呼叫,就會停止。使用此選項執行時,您將會看到記錄,指出評估了哪些內容以及在哪裡停止。

這種最佳化可能會縮小或增加程式碼大小。例如,如果少量程式碼在記憶體中產生許多變更,則整體大小可能會增加。

LLVM 的 GlobalOpt 幾乎執行此操作。在簡單的情況下,如果 LLVM IR 對其邏輯來說不太複雜而無法評估,則它會執行此操作,但對於例如 libc++ iostream 建構函式來說,它還不夠強大。在 LLVM IR 層級很難做到這一點 - LLVM IR 很複雜,而且越來越複雜,因此這將需要 GlobalOpt 擁有完整的直譯器,以及一種回寫到 LLVM IR 全域物件的方式。然而,在 wasm 層級,所有內容都已降低到簡單的低層級,我們也只需要將位元組寫入陣列,因此這對我們來說很容易做到。LLVM 的另一個問題是,它不知道我們不會連結到其他程式碼,因此它只會嘗試使用最低優先權來最佳化建構函式(而我們明確知道是否已啟用動態連結)。

如果設定為值 2,這也會做出一些「不安全」的假設,特別是說在評估建構函式時沒有收到任何輸入。這表示我們忽略了 main() 的引數,並且假設無法讀取任何環境變數。這允許最佳化更多程式,但您需要確保您的程式不依賴這些功能 - 即使只是檢查 argc 的值也可能會導致問題。

預設值:0

TEXTDECODER

啟用後,將使用 JavaScript TextDecoder API 進行字串封送處理。預設為啟用,設定為 0 可停用。若設定為 2,我們會假設 TextDecoder 存在且可用,並且不會發出任何 JS 程式碼來在 TextDecoder 不存在時回退。在單執行緒 -Oz 建置模式中,TEXTDECODER 預設值為 2 以節省程式碼大小。

預設值:1

EMBIND_STD_STRING_IS_UTF8

Embind 特有:若啟用,則假設 std::string 繫結中的資料為 UTF-8 編碼。停用此選項以支援二進位資料傳輸。

預設值:true

EMBIND_AOT

Embind 特有:若啟用,會在編譯時產生 Embind 的 JavaScript 調用函式,並將其包含在 JS 輸出檔案中。當與 DYNAMIC_EXECUTION=0 一起使用時,這會讓匯出的繫結與 DYNAMIC_EXECUTION=1 模式一樣快,但不需要 eval()。如果有很多繫結,JS 輸出大小可能會較大。

預設值:false

OFFSCREENCANVAS_SUPPORT

若設定為 1,則啟用將畫布傳輸到 pthreads 以及在其中建立 WebGL 環境的支援,以及 GL 環境的明確交換控制。這需要瀏覽器支援 OffscreenCanvas 規範。

預設值:false

OFFSCREENCANVASES_TO_PTHREAD

如果您將 PROXY_TO_PTHREAD 與 OFFSCREENCANVAS_SUPPORT 一起使用,請在此處指定一個以逗號分隔的 CSS ID 選擇器清單,以在程式啟動時將畫布代理到 pthread,例如 '#canvas1, #canvas2'。

預設值:「#canvas」

OFFSCREEN_FRAMEBUFFER

若設定為 1,則啟用 WebGL 環境支援渲染到離螢幕渲染目標,以避免 WebGL 的隱式交換行為,即退出任何事件回呼會自動執行「翻轉」以在螢幕上呈現渲染的內容。當 Emscripten GL 環境啟用離螢幕畫面緩衝時,可以從多個事件回呼組合單個畫面,然後明確呼叫交換函式 emscripten_webgl_commit_frame() 以在螢幕上呈現渲染的內容。

離螢幕畫布功能還啟用明確的 GL 畫面交換支援,而且 -sOFFSCREEN_FRAMEBUFFER 功能可用於在瀏覽器中沒有離螢幕畫布支援的情況下,填補在多個執行緒中存取 WebGL 的支援,但會犧牲一些效能和延遲。可以同時啟用離螢幕畫布和離螢幕畫面緩衝支援,並允許使用者在可用時使用離螢幕畫布,否則回退到離螢幕畫面緩衝。

預設值:false

FETCH_SUPPORT_INDEXEDDB

若非零,Fetch API 支援備份到 IndexedDB。若為 0,則不會使用 IndexedDB。如果 IndexedDB 支援對於目標應用程式不重要,請設定為 0 以節省幾 KB 的空間。

預設值:true

FETCH_DEBUG

若非零,則會在 library_fetch.js 中印出偵錯資訊。

預設值:false

FETCH

若非零,則啟用 emscripten_fetch API。

預設值:false

WASMFS

注意 [WIP]:實驗性功能。請自行承擔風險使用。這最終將取代目前的 JS 檔案系統實作。若設定為 1,則使用新的檔案系統實作。

注意

這是一個實驗性設定

預設值:false

SINGLE_FILE

若設定為 1,則將所有子資源以 base64 字串文字的形式嵌入到發出的檔案中。嵌入的子資源可能包含(但不限於)wasm、asm.js 和靜態記憶體初始化程式碼。

當使用依賴此選項的程式碼時,您的內容安全政策可能需要更新。具體來說,嵌入 asm.js 需要 script-src 指令允許 'unsafe-inline',而使用 Worker 需要 child-src 指令允許 blob:。如果您不使用內容安全政策,或者您的 CSP 標頭不包含 script-src 或 child-src,則可以安全地忽略此警告。

預設值:false

AUTO_JS_LIBRARIES

若設定為 1,則所有 JS 程式庫在連結時都會自動可用。這會在 STRICT 模式中(或使用 MINIMAL_RUNTIME)設定為 0,這表示您需要在連結時明確指定 -lfoo.js 才能存取 library_foo.js 中的程式庫函式。

預設值:true

AUTO_NATIVE_LIBRARIES

與 AUTO_JS_LIBRARIES 類似,但適用於原生程式庫,例如 libgl、libal 和 libhtml5。如果停用此功能,則必須明確新增例如 -lhtml5,並且還需要先使用 embuilder 建置程式庫。

預設值:true

MIN_FIREFOX_VERSION

指定要鎖定的最舊 Firefox 主要版本。也就是說,希望所有 Firefox 版本 >= MIN_FIREFOX_VERSION 都能運作。傳遞 -sMIN_FIREFOX_VERSION=majorVersion 以捨棄對舊於 < majorVersion 的 Firefox 版本的支援。Firefox 79 於 2020-07-28 發布。MAX_INT (0x7FFFFFFF 或 -1) 指定不支援目標。支援的最小值為 34,於 2014-12-01 發布。

預設值:79

MIN_SAFARI_VERSION

指定要鎖定的最舊桌面 Safari 版本。版本以 MMmmVV 編碼,例如 70101 表示 Safari 7.1.1。Safari 14.1.0 於 2021 年 4 月 26 日發布,與 macOS 11.0 Big Sur 和 iOS 14.5 捆綁在一起。先前的預設值 Safari 12.0.0 於 2018 年 9 月 17 日發布,與 macOS 10.14.0 Mojave 捆綁在一起。注意:Emscripten 無法產生在 iOS 9.3.5 及更舊版本中運作的程式碼,即 iPhone 4s、iPad 2、iPad 3、iPad Mini 1、Pod Touch 5 及更舊版本,請參閱 https://github.com/emscripten-core/emscripten/pull/7191。MAX_INT (0x7FFFFFFF 或 -1) 指定不支援目標。支援的最小值為 90000,於 2015 年發布。

預設值:140100

MIN_CHROME_VERSION

指定最舊的 Chrome 版本。例如,傳遞 -sMIN_CHROME_VERSION=58 以捨棄對 Chrome 57 及更舊版本的支援。此設定也適用於基於 Chromium 的現代 Edge,它與 Chrome 共用版本號碼。Chrome 85 於 2020-08-25 發布。MAX_INT (0x7FFFFFFF 或 -1) 指定不支援目標。支援的最小值為 32,於 2014-01-04 發布。

預設值:85

MIN_NODE_VERSION

指定為產生的程式碼鎖定的最低節點版本。這與執行 emscripten 編譯器所需的最低版本不同。此版本與目前的 Ubuuntu TLS 20.04 (Focal) 對齊。版本以 MMmmVV 編碼,例如 181401 表示 Node 18.14.01。支援的最小值為 101900,於 2020-02-05 發布。

預設值:160000

SUPPORT_ERRNO

我們是否支援從 JS 程式庫程式碼設定 errno。在 MINIMAL_RUNTIME 建置中,此選項預設為 0。

注意

此設定已棄用

預設值:true

MINIMAL_RUNTIME

如果為 true,則使用沒有 POSIX 功能、Module、preRun/preInit/等等、Emscripten 內建 XHR 載入或 library_browser.js 的最小大小執行階段。啟用此設定以鎖定最小的程式碼大小。設定 MINIMAL_RUNTIME=2 以進一步啟用更多程式碼大小最佳化。這些選項非常粗糙,並且繞過了 Closure 和建置系統其他部分的限制,因此它們可能無法在所有產生的程式中運作(但對於非常小的程式可能很有用)。

預設情況下,不會在 Module 物件上匯出任何符號。為了匯出保持活動的符號,請使用 -sEXPORT_KEEPALIVE=1

預設值:0

MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION

若設定為 1,MINIMAL_RUNTIME 將使用串流 WebAssembly 編譯,其中 WebAssembly 模組會在下載時進行編譯。為了使此功能正常運作,Web 伺服器必須以 HTTP 回應標頭「Content-Type: application/wasm」正確提供 .wasm 檔案。如果不存在此 HTTP 標頭,例如 Firefox 73 會失敗並顯示錯誤訊息 TypeError: Response has unsupported MIME type,而 Chrome 78 會失敗並顯示錯誤訊息 Uncaught (in promise) TypeError: Failed to execute ‘compile’ on ‘WebAssembly’: Incorrect response MIME type. Expected ‘application/wasm’。如果設定為 0 (預設),則停用串流 WebAssembly 編譯,這表示 WebAssembly 模組會先完全下載,然後才會開始編譯。對於大型 .wasm 模組和生產環境,應將此設定為 1 以加快啟動速度。但是,此設定預設為停用,因為它需要伺服器端設定,而且對於非常小的頁面,沒有明顯的差異(也會對程式碼大小產生 ~100 位元組的影響)

預設值:false

MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION

若設定為 1,MINIMAL_RUNTIME 將使用串流 WebAssembly 實例化,其中 WebAssembly 模組會在下載時進行編譯+實例化。與 MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION 適用相同的限制/要求。MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION 和 MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION 不能同時啟用。這兩者中哪一個速度更快取決於 wasm 模組的大小、JS 執行階段檔案的大小、要下載的預載資料檔案的大小以及所使用的瀏覽器。

預設值:false

SUPPORT_LONGJMP

若設定為 'emscripten' 或 'wasm',則編譯器支援 setjmp() 和 longjmp()。若設定為 0,則這些 API 不可用。如果您使用 C++ 例外,但不需要 setjmp()+longjmp() API,則可以將此設定為 0,以便在捕獲例外時節省一些程式碼大小和效能。

'emscripten':(預設) 使用 JavaScript 的 Emscripten setjmp/longjmp 處理 'wasm':使用 Wasm EH 指令的 setjmp/longjmp 處理(實驗性)

  • 0:不進行 setjmp/longjmp 處理

  • 1:預設的 setjmp/longjmp/處理,具體取決於例外情況的模式。如果使用 '-fwasm-exception',則為 'wasm',否則為 'emscripten'。

[compile+link] - 在編譯時,這會啟用在程式碼產生時支援 longjmp 所需的轉換,而在連結時,它允許連結程式庫支援。

預設值:true

DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR

若設定為 1,則停用舊的已棄用的 HTML5 API 事件目標查詢行為。啟用後,沒有「Module.canvas」物件,沒有神奇的「null」預設處理,並且 DOM 元素 'target' 參數被視為引用 CSS 選擇器,而不是引用 DOM ID。

預設值:true

HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS

某些瀏覽器的 DOM API 操作,例如請求全螢幕模式轉換或指標鎖定,要求該請求必須源自使用者觸發的事件,例如滑鼠點擊或鍵盤按下。若要重構應用程式以符合這種程式結構可能會很困難,因此 HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS 允許透過延遲此類請求直到產生適當的事件回呼來透明地模擬這種情況。若您的應用程式不需要支援延遲呼叫,請將此設定為 0 以停用支援,進而節省程式碼大小。

預設值:true

MINIFY_HTML

指定產生的 .html 檔案是否要透過 html-minifier 處理。html-minifier 執行的最佳化步驟集取決於偵錯和最佳化層級。在 -g2 及更高層級中,不執行最小化。在 -g1 中,會執行最小化,但會保留空白字元。最小化需要至少使用 -O1 或 -Os。傳遞 -sMINIFY_HTML=0 以明確選擇完全停用 HTML 最小化。

預設值:true

MAYBE_WASM2JS

我們是否可能正在使用 wasm2js。這會正常編譯為 wasm,但允許您稍後在 wasm 上執行 wasm2js,並且您可以在執行正常的 wasm 或該 wasm2js 程式碼之間選擇。有關如何執行的詳細資訊,請參閱 test_maybe_wasm2js 測試。此選項對於偵錯和二分搜尋可能很有用。

預設值:false

ASAN_SHADOW_SIZE

此選項不再使用。現在會根據 INITIAL_MEMORY 和 MAXIMUM_MEMORY 計算適當的陰影記憶體大小。將在未來版本中移除。

預設值:-1

USE_OFFSET_CONVERTER

是否應使用偏移轉換器。對於舊版本的 v8 (<7.7),這是有必要的,因為舊版本不會在堆疊追蹤中提供 wasm 二進位檔的十六進位模組偏移量,而且為了避免跨函數邊界使用原始程式碼對應項。

預設值:false

LOAD_SOURCE_MAP

是否應在執行時載入 WASM 原始程式碼對應。當搭配 sanitizers 使用 -gsource-map 時,會自動啟用此選項。

預設值:false

DEFAULT_TO_CXX

即使以 emcc 而非 emc++ 的方式執行,預設也使用 c++ 模式。停用此選項後,連結 C++ 程式時需要 em++。停用此選項會符合 gcc/g++ 和 clang/clang++ 的行為。

預設值:true

PRINTF_LONG_DOUBLE

雖然 LLVM 的 wasm32 具有 long double = float128,但我們預設不支援以完整精確度列印該值。相反地,我們會列印為 64 位元雙精度浮點數,這會節省 libc 程式碼大小。您可以開啟此選項,以取得具有完整 long double 列印精確度的 libc。

預設值:false

SEPARATE_DWARF_URL

設定此選項會影響在 -gseparate-dwarf 模式下發出的 wasm 中,指向 DWARF 檔案的路徑。這允許將偵錯檔案託管在自訂位置。

預設值:''

ABORT_ON_WASM_EXCEPTIONS

在呼叫匯出的 WebAssembly 函數時發生未處理的例外狀況時中止。這會使程式的行為更像原生程式,其中當發生未處理的例外狀況 (例如,超出範圍的記憶體存取) 時,作業系統會終止程序,並且無法再執行任何程式碼。這會檢測所有匯出的函數以捕捉擲出的例外狀況,並在發生例外狀況時呼叫 abort()。一旦程式中止,任何匯出的函數呼叫都會失敗,並顯示「程式已中止」例外狀況,以防止呼叫可能已損毀的程式狀態的程式碼。這會在最佳化組建中增加少量固定程式碼大小,以及額外的檢測函數間接導致的輕微額外負荷。如果您希望 Emscripten 妥善處理未處理的例外狀況,但需要額外幾個位元組的代價,請啟用此選項。在 main 函數內發生的例外狀況已透過替代機制處理。

預設值:false

PURE_WASI

建置使用盡可能多的 WASI API 的二進位檔,並包含這些 API 的其他 JS 支援程式庫。這允許 emscripten 產生更符合 WASI 標準的二進位檔,並且允許它處理和執行使用其他 SDK (例如 wasi-sdk) 建置的 WASI 二進位檔。此設定為實驗性設定,可能會變更或移除。隱含 STANDALONE_WASM。

注意

這是一個實驗性設定

預設值:false

IMPORTED_MEMORY

設定為 1 可在 wasm 模組外部定義 WebAssembly.Memory 物件。預設情況下,wasm 模組會定義記憶體並將其匯出至 JavaScript。使用下列設定將會啟用此設定,因為它們依賴於能夠在 JavaScript 中定義記憶體: - -pthread - RELOCATABLE - ASYNCIFY_LAZY_LOAD_CODE - WASM2JS (WASM=0)

預設值:false

SPLIT_MODULE

產生程式碼以載入分割的 wasm 模組。此選項將自動產生兩個 wasm 輸出檔案,一個帶有 .orig 後綴,另一個則沒有。執行時,預設檔案(不帶後綴)會產生稍後可以饋入 wasm-split(binaryen 工具)的檢測資料。此外,產生的 JS 程式碼將包含用於載入分割模組的幫助函數。

預設值:false

AUTOLOAD_DYLIBS

對於 MAIN_MODULE 組建,請在啟動時載入任何動態程式庫相依性,然後再載入主模組。

預設值:true

ALLOW_UNIMPLEMENTED_SYSCALLS

包含未實作的 JS 系統呼叫,以包含在最終輸出中。這允許編譯在執行階段依賴這些系統呼叫的程式,即使這些系統呼叫在執行階段會失敗(或不執行任何操作)。

預設值:true

TRUSTED_TYPES

允許呼叫 Worker(…) 和 importScripts(…) 與 Trusted Types 相容。Trusted Types 是一個網頁平台功能,旨在透過限制 DOM sink API 的使用來減輕 DOM XSS 的影響。請參閱 https://w3c.github.io/webappsec-trusted-types/

預設值:false

POLYFILL

當針對舊版瀏覽器時,emscripten 有時會要求在輸出中包含 polyfill。如果您希望透過其他機制自行處理 polyfill,您可以透過傳遞 -sNO_POLYFILL-sPOLYFILL=0 來防止 emscripten 產生這些 polyfill。使用預設瀏覽器目標時,emscripten 不需要任何 polyfill,因此此設定在明確針對舊版瀏覽器時才需要。

預設值:true

RUNTIME_DEBUG

如果為 true,則將追蹤新增至核心執行階段函數。如果啟用以下任何偵錯設定,則預設會啟用此設定: - PTHREADS_DEBUG - DYLINK_DEBUG - LIBRARY_DEBUG - GL_DEBUG - OPENAL_DEBUG - EXCEPTION_DEBUG - SYSCALL_DEBUG - WEBSOCKET_DEBUG - SOCKET_DEBUG - FETCH_DEBUG

預設值:false

LEGACY_RUNTIME

包含先前是預設執行階段一部分的 JS 程式庫符號。若沒有此選項,則可以透過將這些符號新增至 DEFAULT_LIBRARY_FUNCS_TO_INCLUDE,或透過另一個 JS 程式庫符號的相依性來提供這些符號。

預設值:false

SIGNATURE_CONVERSIONS

使用簽章轉換包裝的使用者定義函數,這些函數會採用或傳回指標引數。僅影響 MEMORY64=1 組建,請參閱 emscripten.py 中的 create_pointer_conversion_wrappers 以了解詳細資訊。針對非指標引數使用 _,針對指標/i53 引數使用 p,針對可選指標/i53 值使用 P。範例用法 -sSIGNATURE_CONVERSIONS=someFunction:_p,anotherFunction:p

預設值:[]