Как скомпилировать файл С++ для WebAssembly?

Предположим, что у меня есть простой, автономный файл С++ (math.cpp):

int add(int x, int y) {
  return x + y;
}

Как мне скомпилировать его в WebAssembly (math.wasm)?

Примечание. Я использую цепочку инструментов Clang.

Ответ 1

Я нашел этот смысл очень полезным.

По сути, это шаги:

  1. (сборка llvm и clang 5.0.0 или выше с -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly)
  2. Скомпилируйте .cpp soure в llvm bitcode с помощью clang:

    clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc

  3. Скомпилируйте битовый код в s-сборку:

    llc -asm-verbose=false -o math.s math.bc

  4. Используйте инструмент binaryen s2wasm для создания файла .wast

    s2wasm math.s > math.wast

  5. Используйте инструмент WABT wast2wasm для перевода текстового файла .wast в двоичный файл .wasm:

    wast2wasm -o math.wasm math.wast

Некоторые шаги кажутся излишними, но я еще не нашел инструмент, позволяющий использовать ярлыки. (Было бы хорошо, если бы llc мог компилироваться непосредственно в .wasm, или если s2wasm действительно создавал двоичные файлы .wasm, как следует из названия.) В любом случае, как только вы получили инструментальную цепочку, запускающую его относительно безболезненно. Обратите внимание, что пока нет стандартных библиотек C или C++ для веб-сборки.

В качестве альтернативы, если вам нужен файл .wasm только для того, чтобы попробовать что-то, вы можете уйти без всяких проблем с цепочкой инструментов. Перейдите по адресу https://mbebenita.github.io/WasmExplorer/, вставьте свой код C/C++ и загрузите скомпилированный файл .wasm.


Спасибо @noontz и @LB-- за указание на то, что

На самом деле, как следует из комментариев, вы можете пропустить двоичный файл и скомпилировать его прямо в wasm из Clang/LLVM. В настоящее время я использую следующую командную строку для C++:

clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm \ 
        --optimize=3 --output test.wasm

Ответ 2

Emscripten поставляется со всем, что вам нужно для компиляции файла C++ в wasm. Emscripten также имеет SDK, который облегчает жизнь, когда дело доходит до установки всех необходимых инструментов.

Однако по умолчанию Emscripten добавит некоторый каркасный код в ваш файл wasm, а также сгенерирует html и javascript.

С помощью Emscripten можно создать минимальный файл wasm, который не содержит ни кода платформы, ни javascript, ни html. Использование опций -s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1 при компиляции с emcc или em++ даст вам минимальный файл wasm.

Следующая команда экспортирует минимальный файл wasm, используя ваши примеры и Emscripten:

em++ math.cpp -o math.wasm -Oz -s SIDE_MODULE=1 -s WASM=1 -s "EXPORTED_FUNCTIONS=['_add']" -s ONLY_MY_CODE=1

Ответ 3

В настоящее время самый простой способ скомпилировать C и С++ - это emscripten. Компоненты, о которых вы упоминаете, являются всеми компонентами, но emscripten - это полная инструментальная цепочка, которая поддерживает построение сквозного интерфейса и включает в себя все необходимые вам компоненты, включая libc/libС++, и множество других полезных библиотек. Он поддерживает таргетинг как asm.js, так и wasm.

Ответ 4

Немного поздно для этого ответа, но есть красивые инструменты онлайн для компиляции ваших скриптов.

Например, я использую этот. Это дает вам минимальную возможность компиляции (C, С++, std99...), но их достаточно: https://wasdk.github.io/WasmFiddle/

И в зависимости от того, как вы собираетесь использовать его, вы можете выбирать между различными языками, такими как x86, Buffer. Вы также можете поделиться своим кодом, функциями, которые я считаю крутыми, когда вы работаете с каким-то другим приятелем: https://wasdk.github.io/WasmFiddle/?gus9d:)

Ответ 5

Основываясь на ответах в этой теме, я создал небольшое руководство.

Для меня самым простым способом было скомпилировать emscripten (веб-сайт также является отличной отправной точкой!) На моей машине, скомпилировать код в wasm, сгенерировать соответствующие привязки и спрятать все это в оболочке на стороне JS для этого. получить хороший интерфейс.

Из-за искажения названия c++ я обнаружил, что начать работать с Си проще.