Emscripten の依存関係を含むプロジェクトのビルド

この投稿では、Emscripten を使用して複数のライブラリで構成されるプロジェクトを構築する方法について説明します。
現時点では、Emscripten は共有ライブラリの構築をサポートしていないため、最初のステップはすべてのライブラリを共有ライブラリから静的ライブラリに転送することです。 Emscripten は独自のインクルード ファイルを使用して動作するため、ヘッダー ファイルの可視性に関する問題は、システム ディレクトリから Emscripten ツールチェーンに転送することで解決する必要があります。

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

CMake を使用している場合は、add_library メソッドの CMakeLists.txt ファイルで SHARED->STATIC を変更する必要があります。次のコマンドを使用して、さらに静的リンクを行うためのライブラリ/アプリケーションを構築できます。

emcmake cmake .
emmake make

次に、リンク段階で *.a ライブラリ ファイルを指定してメイン アプリケーションを構築する必要があります。相対パスを指定できませんでした。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()

ソース

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

失われた Emscripten 例外と正規表現の問題

例外の紛失

Emscripten の興味深い機能: emscripten_set_main_loop 経由でゲーム ループを開始するときは、ループ メソッド内で直接 try catch 経由で例外処理を再追加する必要があることに注意してください。ランタイムは外部からのトライキャッチブロックに負け
ます。最も簡単な方法は、ブラウザで 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();

正規表現が複雑すぎます

正規表現の標準実装は、正規表現が複雑すぎると判断した場合、error_complexity 例外をスローすることがあります。これは emscripten の現在の実装で発生するため、正規表現による解析のテストを実装するか、サードパーティの正規表現実装を使用することをお勧めします。