JavaScript — Использование Boost с Emscripten

У меня есть проект C ++, который я хотел бы преобразовать в веб-приложение. Для этого я хотел бы использовать Emscripten для создания проекта.

В проекте используются некоторые внешние библиотеки. Мне удалось скомпилировать или найти версию JavaScript большинства библиотек, и теперь я застрял с Boost. На самом деле я даже не знаю, как запустить Boost: они используют скрипт boostrap для генерации файлов для сборки библиотек. Можно передать набор инструментов этому сценарию, но Emscripten явно не поддерживается.

Мой проект использует следующие части Boost: Thread, Regex, FileSystem, Signals, System. Как я могу скомпилировать эти библиотеки с помощью Emscripten?

редактировать

После ответа npclaudiu я загрузил библиотеку с помощью gcc toolkit, затем отредактировал project-config.jam настроить компилятор, заменив:

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

Теперь, набрав ./b2 эффективно строит библиотеки. Boost.Signals и Boost.System компилируются хорошо. У остальных есть ошибки.

Boost.Thread жалуется:

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

Boost.Regex много жалуется на то, что CHAR_BIT не объявлен, но, похоже, это проблема в 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, похоже, не работает из-за 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;
~~^

25

Решение

Мне наконец удалось собрать необходимые библиотеки с помощью emscripten. Вот шаги, за которыми я следовал.

редактировать system/include/libcxx/climits добавить следующие определения (см. 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

Добавьте следующую строку в system/include/libcxx/cwchar

#include <cstdio>

Как предлагает npclaudiu, загрузите библиотеку, используя инструментарий gcc. Затем отредактируйте project-config.jam настроить компилятор и заменить:

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

сила BOOST_HAS_SCHER_YIELD в boost/config/posix_features.hppвокруг линии 67.

Затем скомпилируйте библиотеки: ./b2 thread regex filesystem signals system

Сделайте все вышеописанные шаги, затем отредактируйте tools/build/v2/tools/gcc.jam и заменить:

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

с

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

а также

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

с

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

Скомпилируйте библиотеки: ./b2 link=static variant=release threading=single runtime-link=static thread signals system filesystem regex

23

Другие решения

Напомним, что Boost теперь включает набор инструментов «emscripten», что (по моему опыту) делает описанный выше процесс ненужным.

Чтобы использовать, Boostrap Boost как обычно, затем скомпилируйте с b2 (или bjam) следующим образом:

b2 toolset=emscripten
6

Вы можете попробовать настроить библиотеки Boost, указав gcc как набор инструментов, как рекомендует себя Emscripten как быстрая замена gcc. Кроме того, я думаю, что для этого случая лучше создать Boost как статические библиотеки. Имейте в виду, что большинство библиотек Boost предназначены только для заголовков, потому что они определяют только шаблоны классов / функций.

2

Я не знаю, видел ли ты этот конкретный вопрос в Часто задаваемые вопросы, но если у вас нет:

В. Как связать системные библиотеки, такие как SDL, boost и т. Д.?

О. Системные библиотеки, включенные в emscripten — libc, libc ++ (C ++ STL) и SDL — автоматически включаются при компиляции (и только необходимые их части). Вам даже не нужен -lSDL, в отличие от других компиляторов (но -lSDL тоже не повредит).

Другие библиотеки, не включенные в emscripten, как повышение, вам нужно будет скомпилировать себя и связать с вашей программой, как если бы они были модулем в вашем проекте. Например, посмотрите, как BananaBread ссылки в libz. (Обратите внимание, что в конкретном случае повышения, если вам нужны только заголовки повышения, вам не нужно ничего компилировать.)

Другой вариант для библиотек, которые не включены, состоит в том, чтобы реализовать их как библиотеку JS, как emscripten для libc (минус malloc) и SDL (но не libc ++ или malloc). Смотрите —js-library в emcc.

1
По вопросам рекламы [email protected]