Construire un projet avec des dépendances pour Emscripten

Dans cet article, je décrirai la construction d’un projet composé de plusieurs bibliothèques utilisant Emscripten.
Pour le moment, Emscripten ne prend pas en charge la création de bibliothèques partagées, la première étape consiste donc à transférer toutes les bibliothèques de Partagé vers Statique. Emscripten fonctionne avec ses propres fichiers d’inclusion, le problème de visibilité des fichiers d’en-tête doit donc être résolu en transmettant un lien symbolique du répertoire système vers la chaîne d’outils Emscripten :

ln -s /usr/local/include/FlameSteelFramework $EMSDK/fastcomp/emscripten/system/include/FlameSteelFramework

Si vous utilisez CMake, vous devez alors modifier SHARED->STATIC dans le fichier CMakeLists.txt de la méthode add_library. Vous pouvez créer une bibliothèque/application pour des liens statiques supplémentaires à l’aide des commandes :

emcmake cmake .
emmake make

Ensuite, vous devrez construire l’application principale en spécifiant les fichiers de bibliothèque *.a au stade de la liaison. Je n’ai pas pu spécifier un chemin relatif ; la construction s’est terminée correctement uniquement après avoir spécifié les chemins complets dans le fichier CMakeLists.txt :

elseif(EMSCRIPTEN)
target_link_libraries(${FSEGT_PROJECT_NAME} GL GLEW 
/home/demensdeum/Sources/cube-art-project-bootstrap/cube-art-project/sharedLib/libCubeArtProject.a 
/home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelEngineGameToolkitFSGL/libFlameSteelEngineGameToolkitFSGL.a 
/home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelEngineGameToolkit/libFlameSteelEngineGameToolkit.a 
/home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelCore/libFlameSteelCore.a 
/home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelBattleHorn/libFlameSteelBattleHorn.a 
/home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FSGL/libFSGL.a 
/home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelCommonTraits/libFlameSteelCommonTraits.a)
else()

Sources

https://emscripten.org/ docs/compiling/Building-Projects.html#using-libraries

Exceptions Emscripten perdues et problèmes d’expression régulière

Exception perdue

Une fonctionnalité intéressante d’Emscripten : lorsque vous démarrez une boucle de jeu via emscripten_set_main_loop, vous devez vous rappeler que la gestion des exceptions doit être ré-ajoutée via try catch directement dans la méthode de boucle, car Le runtime perd le bloc try catch de l’extérieur.
Le moyen le plus simple est d’afficher le texte d’erreur à l’aide du navigateur à l’aide de l’alerte javascript :

            catch (const std::exception &exc)
            {
                const char *errorText = exc.what();
                cout << "Exception: " << errorText << "; Stop execution" << endl;

                EM_ASM_(
                {
                    var errorText = UTF8ToString($0);
                    alert(errorText);

                }, errorText);

                abort();

Expression rationnelle trop complexe

L'implémentation std de regex peut lever une exception error_complexity si elle considère que l'expression régulière est trop complexe. Cela se produit dans l'implémentation actuelle d'emscripten, je vous suggère donc d'implémenter des tests d'analyse via des expressions régulières ou d'utiliser des implémentations d'expressions régulières tierces.