2013-03-30 7 views
24

Ich habe ein C++ Projekt, das ich in eine Webanwendung konvertieren möchte. Zu diesem Zweck möchte ich Emscript verwenden, um das Projekt zu erstellen.Boost mit Emscript verwenden

Das Projekt verwendet einige externe Bibliotheken. Ich habe es geschafft, die JavaScript-Version der meisten Bibliotheken zu kompilieren oder zu finden und jetzt bin ich mit den Boost-Dateien fest. Eigentlich weiß ich gar nicht, wie ich bei Boost anfangen soll: Sie benutzen ein Boostrap-Skript, um die Dateien zum Erstellen der Bibliotheken zu erzeugen. Es ist möglich, das Toolset an dieses Skript zu übergeben, aber Emscripten wird offensichtlich nicht unterstützt.

Mein Projekt verwendet die folgenden Teile von Boost: Thread, Regex, Dateisystem, Signale, System. Wie kann ich diese Bibliotheken mit Emscripten kompilieren?

bearbeiten

die Antwort von npclaudiu Folgen, ich die Bibliothek mit dem gcc-Toolkit Bootstrap, dann bearbeiten ich project-config.jam die Compiler zu konfigurieren, zu ersetzen:

# 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 ; 
} 

mit

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

Nun können Sie mit der Eingabe ./b2 die Bibliotheken erstellen. Boost.Signals und Boost.System kompilieren sich gut. Die anderen haben einige Fehler.

Boost.Thread klagt:

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

Boost.Regex viel über CHAR_BIT klagt nicht angemeldeten, aber es scheint ein Problem in Emscripten zu sein:

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 scheint zum Scheitern verurteilt wegen emscripten auch:

+0

Web-Backend oder Frontend? –

+0

Es wäre Frontend. Es ist ein Spiel, das ich in einem Webbrowser spielen möchte. – Julien

+1

Um nur neugierig zu sein, wie viele MB braucht Boost, wenn es kompiliert wird, um Code zu emscripten? : D – GameDeveloper

Antwort

21

Ich habe es endlich geschafft, die benötigten Bibliotheken mit emscripten zu kompilieren. Hier sind die Schritte, denen ich gefolgt bin.

Änderungen in Emscripten

bearbeiten system/include/libcxx/climits die folgenden Definitionen hinzufügen (siehe 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 

Fügen Sie die folgende Zeile in system/include/libcxx/cwchar

#include <cstdio> 

Kompilieren-Boost als gemeinsam genutzte Bibliotheken

Wie von npclaudiu vorgeschlagen, bootstrap die Bibliothek mit dem GCC-Toolkit. Dann project-config.jam bearbeiten Sie den Compiler zu konfigurieren und ersetzen:

# 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 ; 
} 

mit

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

Kraft BOOST_HAS_SCHER_YIELD in boost/config/posix_features.hpp, um die Linie 67.

dann die Bibliotheken kompilieren: ./b2 thread regex filesystem signals system

compilieren Boost als statische Bibliotheken

Sie alle oben genannten Schritte, dann tools/build/v2/tools/gcc.jam bearbeiten und ersetzen:

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

mit

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

und

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

mit

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

Comp ile die Bibliotheken: ./b2 link=static variant=release threading=single runtime-link=static thread signals system filesystem regex

+0

Große Arbeit @julien. Haben Sie versucht, 'user-config.jam' zu verwenden, anstatt die Pfade fest zu codieren? – abergmeier

+0

@LCIDFire Ich war mit den Konfigurationsdateien von Boost nicht vertraut genug, also habe ich 'user-config.jam' nicht versucht. Es war wirklich eine Trial-and-Error-Progression und ich muss noch arbeiten, bevor mein Spiel läuft. – Julien

+0

ok, wenn du willst, kannst du mich auf irc treffen. – abergmeier

1

Ich weiß nicht, ob Sie das zufällig gesehen haben besondere Frage in der FAQ, aber falls Sie nicht:

Q. Wie verknüpfe ich gegen System-Bibliotheken wie SDL, Boost, etc.?

A. Systembibliotheken, die in emscripten enthalten sind - libc, libC++ (C++ STL) und SDL - werden automatisch beim Kompilieren einbezogen (und nur die notwendigen Teile davon). Du brauchst nicht -lsdl, im Gegensatz zu anderen Compilern (aber -lsdl wird auch nicht weh tun).

Andere Bibliotheken nicht enthalten mit emscripten, wie boost, müssten Sie sich kompilieren und verknüpfen Sie mit Ihrem Programm, als ob sie ein Modul in Ihrem Projekt waren. Siehe zum Beispiel BananaBread links in libz. (Beachten Sie, dass in dem speziellen Fall von Boost, wenn Sie nur die Boost-Header benötigen, Sie nichts kompilieren müssen.)

Eine weitere Option für Bibliotheken, die nicht enthalten sind, ist, sie als eine JS-Bibliothek wie Emscripten zu implementieren für libc (minus malloc) und SDL (aber nicht libC++ oder malloc). Siehe --js-Bibliothek in EMCC.

+1

Ich habe diese Frage gesehen und deshalb versuche ich Boost mit emscripten zu kompilieren. – Julien

2

Sie könnten versuchen, Boost-Bibliotheken konfigurieren gcc als Toolset Angabe, wie Emscripten empfiehlt sich as being a drop-in replacement for gcc.Außerdem finde ich es besser, Boost als statische Bibliotheken für diesen Fall zu erstellen. Denken Sie daran, dass die meisten Boost-Bibliotheken nur für den Header gedacht sind, da sie nur Template-Klassen/Funktionen definieren.

+0

Die Boost-Bibliotheken, die in meiner Frage aufgelistet sind, sind nicht nur Header, sonst wäre es zu einfach :) Ich werde Ihre Lösung versuchen, ich muss nur herausfinden, wie Boost mit 'emcc' anstelle von' gcc' kompiliert werden kann. – Julien

3

Für die Aufzeichnung enthält Boost jetzt ein "emscripten" Toolset, das (nach meiner Erfahrung) den oben beschriebenen Prozess überflüssig macht.

zu verwenden, Bootstrap-Boost als normal, dann mit b2 kompilieren (oder bjam) wie folgt:

b2 toolset=emscripten 
Verwandte Themen