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;
~~^
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_YIELD
boost/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
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
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.
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.