Utiliser Boost avec Emscripten

j'ai un projet c++ que j'aimerais convertir en application web. Pour cela, je voudrais utiliser Emscripten pour construire le projet.

le projet fait appel à des bibliothèques externes. J'ai réussi à compiler ou trouver la version JavaScript de la plupart des bibliothèques et maintenant je suis coincé avec les Boost. En fait je ne sais même pas comment commencer pour Boost: ils utilisent un bootstrap script pour générer les fichiers pour créer les bibliothèques. Il est possible de passer l'ensemble des outils à ce script mais Emscripten n'est évidemment pas supporté.

mon projet utilise les parties suivantes de Boost: Thread, Regex, FileSystem, Signals, System. Comment puis-je compiler ces bibliothèques en utilisant Emscripten?

Modifier

suivant la réponse de npclaudiu, j'ai bootstrappé la bibliothèque avec la boîte à outils gcc, puis j'ai édité project-config.jam pour configurer le compilateur, en remplacement de:

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

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

maintenant, tapez ./b2 s'appuie efficacement bibliothèque. Stimuler.Signaux et Boost.Système de compilation. Les autres ont quelques erreurs.

coup de pouce.Thread se plaint:

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

coup de pouce.Regex se plaint beaucoup de la non-déclaration de CHAR_BIT, mais cela semble être un problème dans 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);
                                                                                       ^

coup de pouce.Le système de fichiers semble aussi avoir échoué à cause d'emscripten:

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;
      ~~^
24
demandé sur Julien 2013-03-31 02:47:20

4 réponses

j'ai enfin réussi à compiler les bibliothèques nécessaires avec emscripten. Voici les étapes que j'ai suivies.

Changements dans emscripten

Modifier system/include/libcxx/climits pour ajouter les définitions suivantes (voir 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

ajouter la ligne suivante dans system/include/libcxx/cwchar

#include <cstdio>

la Compilation de Boost des bibliothèques partagées

comme suggéré par npclaudiu, bootstrap la bibliothèque en utilisant le gcc Toolkit. Puis modifier project-config.jam pour configurer le compilateur et de remplacer:

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

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

Force BOOST_HAS_SCHER_YIELDboost/config/posix_features.hpp, autour de la ligne 67.

puis compilez les bibliothèques:./b2 thread regex filesystem signals system

la Compilation de Boost comme les bibliothèques statiques

Faire toutes les étapes ci-dessus, puis modifier tools/build/v2/tools/gcc.jam et remplacer:

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

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

et

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

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

compilez les bibliothèques:./b2 link=static variant=release threading=single runtime-link=static thread signals system filesystem regex

21
répondu Julien 2013-03-31 18:22:49

pour mémoire, Boost inclut maintenant un ensemble d'outils" emscripten", qui (d'après mon expérience) rend le processus décrit ci-dessus inutile.

Pour l'utilisation, bootstrap boost comme d'habitude, puis compilez avec b2 (ou bjam) comme ceci:

b2 toolset=emscripten 
5
répondu Mike_L 2017-12-11 10:47:16

Vous pouvez essayer de configurer les bibliothèques Boost spécifiant gcc comme ensemble d'outils, comme Emscripten se recommande en tant que remplaçant direct de gcc. Aussi, je pense que c'est mieux si vous construisez Boost comme bibliothèques statiques pour cette affaire. Gardez à l'esprit que la plupart des bibliothèques Boost ne sont qu'en-tête, car elles ne définissent que les classes/fonctions de template.

2
répondu npclaudiu 2013-03-30 23:08:02

je ne sais pas si vous avez vu cette question en particulier, dans le FAQ

Q. Comment faire un lien avec des bibliothèques système comme SDL, boost,etc.?

A. Les bibliothèques système qui sont incluses avec emscripten-libc, libc++ (C++ STL) et SDL - sont automatiquement incluses lors de la compilation (et seulement les parties nécessaires). Vous n'avez même pas besoin de-lSDL, contrairement à d'autres compilateurs (mais-lSDL ne fera pas de mal soit.)

autres bibliothèques non incluses dans emscripten,comme boost, vous devez le compiler vous-même et en lien avec votre programme, comme s'ils étaient un module dans votre projet. Voir, par exemple, comment liens BananaBread dans libz. (Notez que dans le cas spécifique de boost, si vous n'avez besoin que des en-têtes boost, vous n'avez pas besoin de compiler quoi que ce soit.)

une autre option pour les bibliothèques non incluses est de les implémenter en tant que Bibliothèque JS, comme emscripten le fait pour libc (moins malloc) et SDL (mais pas libc++ ou malloc). Voir --js-bibliothèque de l'emcc.

1
répondu Jorge Israel Peña 2013-03-30 23:02:34