Générer une bibliothèque pour un projet Wasm
Des fichiers sources C++ sont compilés en fichiers objets réunis dans un seul fichier bibliothèque.
Dans l'article précédent, on a vu comment Compiler en Wasm un projet de plusieurs sources C++ pour obtenir un programme local. Pour éviter de recompiler tous les fichiers sources à chaque modification de l'un d'eux, il faut créer une bibliothèque de fichiers objets que l'on pourra inclure directement dans un projet.
Pour que cela fonctionne, les fichiers objets ne doivent pas être produits par un compilateur classique comme GCC ou même CLang, il doivent être générés par Emcc.
1) Bibliothèque de deux fichiers exemples
L'exemple de bibliothèque est composé de deux fichiers, l'un contient des fonctions arithmétiques simples et l'autre l'algorithme de Fibonacci.
Premier fichier source:
int add(int x, int y) {
return x + y;
}
int mul(int x, int y) {
return x * y;
}
float divide(float x, float y) {
if(y == 0) return 0;
return x / y;
}
Second fichier source:
int fibonacci(int n) {
if(n < 2) {
return 1;
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
Les codes sources sont sauvés sous les noms de arithm.cpp et fibonacci.cpp
Les fichier d'en-tête seront sauvegardé sous le nom de arithm.hpp:
int add(int, int);
int mul(int, int);
float divide(float, float)
Et fibonacci.hpp:
int fibonacci(int);
2) Code source principal
Code source du programme de démonstration utilisant les fonctions de la bibliothèque:
/* Démonstration */
#include <iostream>
#include "arithm.hpp"
#include "fibonacci.hpp"
int main() {
int a = add(10, 20);
std::cout << "10 + 20 = " << a << std::endl;
int m = mul(10, 20);
std::cout << "10 x 20 = " << m << std::endl;
float d = divide(30, 10);
std::cout << "30 / 10 = " << d << std::endl;
std::cout << "Fibonacci(16):" << fibonacci(16) << std::endl;
}
3) Générer la bibliothèque
Premier fichier:
em++ arithm.cpp -c -o arithm.o -Oz -s SIDE_MODULE=1 -s WASM=1
Second fichier:
em++ fibonacci.cpp -c -o fibonacci.o -Oz -s SIDE_MODULE=1 -s WASM=1
Vous pouvez inclure éventuellement dans la commande des fichiers d'en-tête externes avec l'option -I
Les fichiers objets sont réunis dans un fichier bibliothèque avec la commande emar incluse dans emscriptem.
emar rcs demolib.a arithm.o fibonacci.o
Cela produit le fichier suivant:
demolib.a
4) Utiliser la bibliothèque
Le fichier bibliothèque peut alors être inclus dans la commande de compilation du programme principal.
emcc demolib.a demoprj.cpp -o demoprj.wasm -s WASM=1
5) Exécution du programme
wasmer demoprj.wasm
Ce qui affichera:
10 + 20 = 30
10 x 20 = 200
30 / 10 = 3
Fibonacci(16):1597