44 votes

Comment compiler un fichier C ++ vers WebAssembly?

Supposons que j'ai un simple fichier C ++ autonome ( math.cpp ) comme ceci:

 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.

35voto

kazemakase Points 2505

J'ai trouvé ce résumé très utile.

Fondamentalement, ce sont les étapes:

  1. (construire llvm et clang 5.0.0 ou au-dessus avec -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly)
  2. Compiler le .rpc soure de llvm bitcode avec clang:

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

  3. Compiler le bitcode à s-assemblée:

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

  4. Utilisation binaryen's s2wasm outil pour créer une .étais fichier

    s2wasm math.s > math.wast

  5. Utilisation WABT's wast2wasm outil pour traduire le texte .étais fichier en binaire .wasm:

    wast2wasm -o math.wasm math.wast

Certaines étapes se sentir redondant, mais je n'ai pas encore trouvé un outil qui permet à des raccourcis. (Ce serait bien si llc pourrait compiler directement .wasm, ou si s2wasm effectivement créé binaire .wasm fichiers comme son nom l'indique.) De toute façon, une fois que vous avez obtenu l'ensemble des outils de course il est relativement indolore. Notez, cependant, qu'il n'y a pas de C ou de C++ bibliothèques standard pour le web de l'assemblée encore.

Alternativement, si vous avez besoin de la .wasm fichier juste pour essayer des choses que vous pouvez sortir sans tous les outils de la difficulté. Accédez à https://mbebenita.github.io/WasmExplorer/, collez-le dans votre code C/C++ , et de télécharger la compilation .wasm fichier.


Merci @noontz et @LB-- pour préciser que

En fait, les commentaires dans les gist suggèrent que vous pouvez sauter binaryen et de compiler directement à wasm de Clang/LLVM. Je suis actuellement en utilisant la ligne de commande suivante pour C++ :

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

12voto

Clint Points 1378

Emscripten est livré avec tout ce dont vous aurez besoin pour compiler un fichier C++ wasm. Emscripten a également un SDK qui rend la vie plus facile quand il s'agit de l'installation de tous les outils nécessaires.

Par défaut, cependant, Emscripten d'ajouter un peu de code de la structure de votre wasm fichier ainsi que de générer du code html et javascript.

Il est possible de créer un minimum de wasm fichier avec Emscripten qui ne comprennent pas les code de la structure, javascript ou html. À l'aide des options -s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1 lors de la compilation avec emcc ou em++ vous donnera un minimum de wasm fichier.

La commande suivante à l'exportation minimal wasm fichier à l'aide de vos exemples et de Emscripten:

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

7voto

Petter Points 5822

À partir de 2019, Clang (8) prend en charge l'assemblage Web hors de la boîte. Voici un référentiel qui contient tout le nécessaire pour compiler, lier et exécuter un simple fichier .wasm.

https://github.com/PetterS/clang-wasm

4voto

Derek Points 243

Actuellement, le moyen le plus simple de compiler C et C ++ est avec 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 comprend toutes les parties dont vous avez besoin, y compris libc / libc ++, et une variété d'autres bibliothèques utiles. Il prend en charge le ciblage à la fois asm.js et wasm.

2voto

Latsuj Points 210

Un peu en retard pour cette réponse, mais il y a de beaux outils en ligne pour la compilation de vos scripts.

Par exemple, je suis en utilisant ce une seule. Que l'un de vous donner minimum option de compilation (C,C++,std99...) mais il y a suffisamment d' : https://wasdk.github.io/WasmFiddle/

Et en fonction de la façon dont vous allez utiliser, vous pouvez choisir entre différentes langues telles que le x86, le code de la mémoire Tampon. Vous pouvez également partager votre code, type de fonctions que je trouve cool lorsque vous travaillez avec un autre copain : https://wasdk.github.io/WasmFiddle/?gus9d :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X