Как мне скомпилировать файл C ++ в WebAssembly?

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

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

Как бы я скомпилировал его в WebAssembly (math.wasm)?

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

23

Решение

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

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

  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. использование binaryens2wasm инструмент для создания .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
20

Другие решения

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 и C ++ — это emscripten. Упомянутые вами компоненты — это все компоненты, но emscripten — это полный набор инструментов, который поддерживает комплексное построение и включает в себя все необходимые вам части, включая libc / libc ++ и множество других полезных библиотек. Он поддерживает таргетинг как asm.js, так и wasm.

2

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

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

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

1
По вопросам рекламы [email protected]