javascript game - Usare Boost con Emscripten




2 Answers

Sono finalmente riuscito a compilare le librerie necessarie con emscripten. Ecco i passi che ho seguito.

Modifiche in emscripten

Modifica system/include/libcxx/climits per aggiungere le seguenti definizioni (vedi http://github.com/kripken/emscripten/issues/531 ):

#ifndef CHAR_BIT
# define CHAR_BIT __CHAR_BIT__
#endif

#ifndef CHAR_MIN
# define CHAR_MIN (-128)
#endif

#ifndef CHAR_MAX
# define CHAR_MAX 127
#endif

#ifndef SCHAR_MIN
# define SCHAR_MIN (-128)
#endif

#ifndef SCHAR_MAX
# define SCHAR_MAX 127
#endif

#ifndef UCHAR_MAX

# define UCHAR_MAX 255
#endif

#ifndef SHRT_MIN
# define SHRT_MIN (-32767-1)
#endif

#ifndef SHRT_MAX
# define SHRT_MAX 32767
#endif

#ifndef USHRT_MAX
# define USHRT_MAX 65535
#endif

#ifndef INT_MAX
# define INT_MAX __INT_MAX__
#endif

#ifndef INT_MIN
# define INT_MIN (-INT_MAX-1)
# define INT_MIN (-INT_MAX-1)
#endif

#ifndef UINT_MAX
# define UINT_MAX (INT_MAX * 2U + 1)
#endif

#ifndef LONG_MAX
# define LONG_MAX __LONG_MAX__
#endif

#ifndef LONG_MIN
# define LONG_MIN (-LONG_MAX-1)
#endif

#ifndef ULONG_MAX
# define ULONG_MAX (LONG_MAX * 2UL + 1)
#endif

Aggiungi la seguente riga in system/include/libcxx/cwchar

#include <cstdio>

Compilazione Boost come librerie condivise

Come suggerito da npclaudiu, avvia la libreria usando il toolkit gcc. Quindi modificare project-config.jam per configurare il compilatore e sostituire:

# 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/emscripten/em++" ;
}

Forza BOOST_HAS_SCHER_YIELD in boost/config/posix_features.hpp , attorno alla riga 67.

Quindi compila le librerie: ./b2 thread regex filesystem signals system

Compilazione Boost come librerie statiche

tools/build/v2/tools/gcc.jam tutti i passaggi precedenti, quindi modifica gli tools/build/v2/tools/gcc.jam e sostituisci:

toolset.flags gcc.archive .AR $(condition) : $(archiver[1]) ;

con

toolset.flags gcc.archive .AR $(condition) : "/full/path/to/emscripten/emar" ;

e

toolset.flags gcc.archive .RANLIB $(condition) : $(ranlib[1]) ;

con

toolset.flags gcc.archive .RANLIB $(condition) :
  "/full/path/to/emscripten/emranlib" ;

Compilare le librerie: ./b2 link=static variant=release threading=single runtime-link=static thread signals system filesystem regex

doom download

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;
      ~~^



Potresti provare a configurare le librerie Boost specificando gcc come set di strumenti, poiché Emscripten si raccomanda di sostituirlo con gcc . Inoltre, penso che sia meglio costruire Boost come librerie statiche per questo caso. Tenere presente che la maggior parte delle librerie Boost sono solo di intestazione, poiché definiscono solo classi / funzioni del modello.




Related