[javascript] Usare Boost con Emscripten



Answers

Per la cronaca, Boost ora include un set di strumenti "emscripten", che (secondo la mia esperienza) rende superfluo il processo sopra descritto.

Per usare, boostrap boost normalmente, quindi compilare con b2 (o bjam) in questo modo:

b2 toolset=emscripten 
Question

Ho un progetto c ++ che vorrei convertire in un'applicazione web. Per questo scopo, vorrei usare Emscripten per costruire il progetto.

Il progetto utilizza alcune librerie esterne. Sono riuscito a compilare o trovare la versione JavaScript della maggior parte delle librerie e ora sono bloccato con quelle Boost. In realtà non so nemmeno come iniziare per Boost: usano uno script boostrap per generare i file per costruire le librerie. È possibile passare il set di strumenti a questo script ma Emscripten non è ovviamente supportato.

Il mio progetto utilizza le seguenti parti di Boost: Thread, Regex, FileSystem, Segnali, Sistema. Come posso compilare queste librerie usando Emscripten?

modificare

Seguendo la risposta di npclaudiu, ho eseguito il bootstrap della libreria con il toolkit gcc, quindi ho modificato project-config.jam per configurare il compilatore, sostituendo:

# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
    using gcc ;
}

con

# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
    using gcc : : "/full/path/to/em++" ;
}

Ora, digitando ./b2 crea effettivamente le librerie. Boost.Signals e Boost.System si compilano bene. Gli altri hanno degli errori.

Boost.Thread si lamenta:

libs/thread/src/pthread/thread.cpp:503:27: error: use of undeclared identifier 'pthread_yield'
        BOOST_VERIFY(!pthread_yield());
                      ^

Boost.Regex si lamenta molto del fatto che CHAR_BIT non sia dichiarato ma sembra essere un problema in emscripten:

In file included from libs/regex/build/../src/c_regex_traits.cpp:28:
In file included from ./boost/regex/v4/c_regex_traits.hpp:26:
In file included from ./boost/regex/v4/regex_workaround.hpp:35:
/path/to/emscripten/system/include/libcxx/vector:1989:92: error: use of undeclared identifier 'CHAR_BIT'
static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
                                                                                       ^

Boost.FileSystem sembra fallire a causa di un'eccessiva espressione:

In file included from libs/filesystem/src/windows_file_codecvt.cpp:21:
/path/to/emscripten/system/include/libcxx/cwchar:117:9: error: no member named 'FILE' in the global namespace
using ::FILE;
      ~~^



Non so se ti è capitato di vedere questa particolare domanda nelle FAQ , ma nel caso tu non l'abbia:

D. Come faccio a collegarmi a librerie di sistema come SDL, boost, ecc.?

A. Le librerie di sistema incluse in emscripten - libc, libc ++ (C ++ STL) e SDL - vengono automaticamente incluse quando si compila (e solo le parti necessarie di esse). Non hai nemmeno bisogno di -lSDL, a differenza di altri compilatori (ma -lSDL non farà male a nessuno).

Altre librerie non incluse in emscripten, come boost , dovresti compilare te stesso e collegarti al tuo programma, proprio come se fossero un modulo nel tuo progetto. Ad esempio, vedi come BananaBread link in libz . (Nota che nel caso specifico di boost, se hai solo bisogno delle intestazioni boost, non devi compilare nulla).

Un'altra opzione per le librerie non incluse è quella di implementarle come una libreria JS, come ad esempio emscripten per libc (meno malloc) e SDL (ma non per libc ++ o malloc). Vedi --js-library in emcc.






Related