我有一个C ++项目,我想转换到Web应用程序。 为此,我想用Emscripten建设项目。
该项目采用一些外部库。 我设法编译或发现大多数图书馆的JavaScript版本,现在我坚持使用Boost的。 事实上,我甚至不知道如何下手的提升:他们使用的自举脚本生成的文件来构建库。 这是可能的工具集传递给该脚本,但显然不支持Emscripten。
我的项目使用升压的以下部分:螺纹,正则表达式,文件系统,信号系统。 我怎样才能使用Emscripten编译这些库?
编辑
继npclaudiu的答案,我自举库与海湾合作委员会工具包,然后我编辑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;
~~^
我终于设法编译emscripten需要的库。 下面是我遵循的步骤。
在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
对于记录,现在升压包括一个“emscripten”工具集,其(在我的经验),使上述不需要的所描述的过程。
使用时,自举升压为正常,然后用B2(或的bjam)编译像这样:
b2 toolset=emscripten
你可以尝试配置Boost库指定gcc
的工具集,为Emscripten建议本身作为一个下拉更换为GCC 。 另外,我觉得这是更好,如果你建立升压为静态库对于这种情况。 请记住,大部分Boost库都,只有头,因为他们只定义模板类/功能。
我不知道,如果你碰巧看到在这个特殊的问题FAQ ,但如果你没有:
问:如何对链接系统库像SDL,升压,等等?
附带emscripten A.系统库 - libc中,libc中++(C ++ STL)和SDL - 在编译时(而只是其中的必要部分)会自动包括在内。 你甚至都不需要-lSDL,不同于其他的编译器(但-lSDL不会伤害任何)。
其他库不包含emscripten, 喜欢刺激 ,你需要自己编译和链接与您的程序,就好像他们在项目中的模块。 例如,看到香蕉面包的libz进行链接 。 (请注意,在提升的具体情况,如果你只需要升压头,您不需要编译任何东西。)
对于未列入库的另一个选项是实现它们作为一个JS库,像emscripten确实为libc的(负的malloc)和SDL(但不是libc中++或内存分配)。 见EMCC --js库。