web-dev-qa-db-fra.com

Comment compiler un fichier C++ dans WebAssembly?

Supposons que j'ai un fichier C++ simple et autonome (math.cpp) comme celui-ci: 

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

Comment pourrais-je le compiler dans WebAssembly (math.wasm)?

Remarque: j'utilise la chaîne d'outils Clang. 

25
sdgfsdh

J'ai trouvé ce Gist d'être très utile.

En gros, voici les étapes:

  1. (construisez llvm et clang 5.0.0 ou plus avec -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly)
  2. Compilez la source .cpp en llvm bitcode avec clang: 

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

  3. Compilez le bitcode dans s-Assembly:

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

  4. Utilisez l'outil s2wasm de binaryen / pour créer un fichier .wast 

    s2wasm math.s > math.wast

  5. Utilisez l’outil wast2wasm de WABT pour traduire le fichier texte .wast en fichier binaire .wasm:

    wast2wasm -o math.wasm math.wast

Certaines étapes semblent redondantes, mais je n’ai pas encore trouvé d’outil permettant des raccourcis. (Ce serait bien si llc pouvait compiler directement dans .wasm ou si s2wasm créait réellement des fichiers binaires .wasm comme son nom l'indique.) Quoi qu'il en soit, une fois que vous avez la chaîne d'outils en cours d'exécution, elle est relativement indolore. Notez cependant qu’il n’existe pas encore de bibliothèques standard C ou C++ pour Web Assembly.

Alternativement, si vous avez besoin du fichier .wasm juste pour essayer des choses, vous pouvez vous en tirer sans tous les problèmes de la chaîne d'outils. Naviguez jusqu'à https://mbebenita.github.io/WasmExplorer/ , collez le code C/C++ et téléchargez le fichier .wasm compilé.


Merci @noontz et @ LB-- d'avoir souligné que

En fait, comme le suggèrent les commentaires dans Gist, vous pouvez ignorer les fichiers binaires et compiler directement sur wasm à partir de Clang/LLVM. J'utilise actuellement la ligne de commande suivante pour C++: 

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

Emscripten est livré avec tout ce dont vous aurez besoin pour compiler un fichier C++ en wasm. Emscripten possède également un SDK qui facilite la vie lorsque l’on installe tous les outils nécessaires.

Par défaut, cependant, Emscripten ajoutera du code d'infrastructure à votre fichier wasm et générera du HTML et du javascript.

Il est possible de créer un fichier wasm minimal avec Emscripten qui n'inclut aucun code de framework, javascript ou html. L'utilisation des options -s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1 lors de la compilation avec emcc ou em++ vous donnera un fichier wasm minimal.

La commande suivante exporterait un fichier wasm minimal en utilisant vos exemples et Emscripten:

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

6
Clint

Actuellement, le moyen le plus simple de compiler C et C++ est d'utiliser emscripten . Les composants que vous mentionnez sont tous des composants, mais emscripten est une chaîne d'outils complète qui prend en charge la construction de bout en bout et inclut toutes les parties dont vous avez besoin, y compris libc/libc ++, ainsi que diverses autres bibliothèques utiles. Il prend en charge le ciblage asm.js et wasm.

2
Derek

Un peu tard pour cette réponse, mais il existe de beaux outils en ligne pour compiler vos scripts.

Par exemple, j'utilise celui-ci. Celui-là vous donnant l'option de compilation minimim (C, C++, std99 ...) mais il y en a suffisamment: https://wasdk.github.io/WasmFiddle/

Et en fonction de votre utilisation, vous pouvez choisir entre différentes langues telles que x86, tampon de code. Vous pouvez également partager votre code, genre de fonctions que je trouve géniales lorsque vous travaillez avec un autre copain: https://wasdk.github.io/WasmFiddle/?gus9d :) 

1
Latsuj

Sur la base des réponses fournies dans ce fil, j'ai créé un petit guide .

Pour moi, le moyen le plus simple était de compiler emscripten (le site Web est également un excellent point de départ!) Sur ma machine, compiler le code pour wasm, générer les liaisons appropriées et masquer tout cela dans un wrapper sur le JS À côté de cela, je reçois une belle interface.

En raison du nom maléfique de c ++, j'ai découvert que démarrer avec C était plus facile.

0
Thomas Deniffel