Предположим, что у меня есть простой, автономный файл С++ (math.cpp
):
int add(int x, int y) {
return x + y;
}
Как мне скомпилировать его в WebAssembly (math.wasm
)?
Примечание. Я использую цепочку инструментов Clang.
Предположим, что у меня есть простой, автономный файл С++ (math.cpp
):
int add(int x, int y) {
return x + y;
}
Как мне скомпилировать его в WebAssembly (math.wasm
)?
Примечание. Я использую цепочку инструментов Clang.
Я нашел этот смысл очень полезным.
По сути, это шаги:
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
)Скомпилируйте .cpp soure в llvm bitcode с помощью clang:
clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc
Скомпилируйте битовый код в s-сборку:
llc -asm-verbose=false -o math.s math.bc
Используйте инструмент binaryen s2wasm для создания файла .wast
s2wasm math.s > math.wast
Используйте инструмент 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
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
В настоящее время самый простой способ скомпилировать C и С++ - это emscripten. Компоненты, о которых вы упоминаете, являются всеми компонентами, но emscripten - это полная инструментальная цепочка, которая поддерживает построение сквозного интерфейса и включает в себя все необходимые вам компоненты, включая libc/libС++, и множество других полезных библиотек. Он поддерживает таргетинг как asm.js, так и wasm.
Немного поздно для этого ответа, но есть красивые инструменты онлайн для компиляции ваших скриптов.
Например, я использую этот. Это дает вам минимальную возможность компиляции (C, С++, std99...), но их достаточно: https://wasdk.github.io/WasmFiddle/
И в зависимости от того, как вы собираетесь использовать его, вы можете выбирать между различными языками, такими как x86, Buffer. Вы также можете поделиться своим кодом, функциями, которые я считаю крутыми, когда вы работаете с каким-то другим приятелем: https://wasdk.github.io/WasmFiddle/?gus9d:)
Основываясь на ответах в этой теме, я создал небольшое руководство.
Для меня самым простым способом было скомпилировать emscripten (веб-сайт также является отличной отправной точкой!) На моей машине, скомпилировать код в wasm, сгенерировать соответствующие привязки и спрятать все это в оболочке на стороне JS для этого. получить хороший интерфейс.
Из-за искажения названия c++ я обнаружил, что начать работать с Си проще.