Javascript 使用Boost和Emscripten 我有一个C++项目,我想转换成一个Web应用程序。为此,我想使用Emscripten来构建项目

Javascript 使用Boost和Emscripten 我有一个C++项目,我想转换成一个Web应用程序。为此,我想使用Emscripten来构建项目,javascript,c++,boost,emscripten,Javascript,C++,Boost,Emscripten,该项目使用一些外部库。我设法编译或找到了大多数库的JavaScript版本,现在我只能使用Boost库。实际上,我甚至不知道如何启动Boost:他们使用boostrap脚本生成文件来构建库。可以将工具集传递给此脚本,但显然不支持Emscripten 我的项目使用Boost的以下部分:线程、正则表达式、文件系统、信号、系统。如何使用Emscripten编译这些库 编辑 根据npclaudiu的回答,我使用gcc工具包引导库,然后编辑project config.jam来配置编译器,替换为: # C

该项目使用一些外部库。我设法编译或找到了大多数库的JavaScript版本,现在我只能使用Boost库。实际上,我甚至不知道如何启动Boost:他们使用boostrap脚本生成文件来构建库。可以将工具集传递给此脚本,但显然不支持Emscripten

我的项目使用Boost的以下部分:线程、正则表达式、文件系统、信号、系统。如何使用Emscripten编译这些库

编辑

根据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 ;
}
Boost.Regex抱怨很多字符位未声明,但这似乎是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);
                                                                                       ^

我不知道您是否碰巧在中看到了这个问题,但如果您没有:

问:如何与SDL、boost等系统库进行链接

A.emscripten附带的系统库—libc、libc++(C++STL)和SDL—在编译时自动包含(以及它们的必要部分)。与其他编译器不同,您甚至不需要-lSDL(但是-lSDL也不会有什么坏处)

emscripten中未包含的其他库,如boost,您需要自己编译并与程序链接,就像它们是项目中的一个模块一样。例如,看看如何。(注意,在boost的特定情况下,如果只需要boost头,则不需要编译任何东西。)

对于未包含的库,另一个选项是将它们实现为JS库,就像emscripten对libc(减去malloc)和SDL(但不是libc++或malloc)所做的那样。请参阅emcc中的--js库


您可以尝试按照Emscripten的建议,将
gcc
指定为工具集来配置Boost库。另外,我认为在这种情况下,最好将Boost构建为静态库。请记住,大多数Boost库都是只包含头的,因为它们只定义模板类/函数。

我终于用emscripten编译了所需的库。以下是我遵循的步骤

emscripten的变化 编辑
system/include/libcxx/climits
以添加以下定义(请参阅):

system/include/libcxx/cwchar

#include <cstdio>


编译库:
/b2 link=static variant=release threading=single runtime link=static thread signals system filesystem regex

为了记录在案,Boost现在包括了一个“emscripten”工具集,以我的经验,它使上述过程变得不必要

要使用bootstrap boost,请按正常方式使用b2(或bjam)编译,如下所示:

emsdk的更新:

经过大量的尝试和错误,我能够通过以下方式让emscripten 1.39编译Boost 1.71:

如果您尚未从安装emsdk

导航到emsdk安装文件夹并执行以下操作:

./emsdk install latest && ./emsdk activate latest && source ./emsdk_env.sh
导航到要克隆Boost repo并运行的目录

git clone --recursive https://github.com/boostorg/boost.git
您可以添加参数'--jobs N',其中N是要克隆子模块的进程数(如果这样做,速度会快得多)

现在使用引导脚本创建boost构建可执行文件b2

./bootstrap.sh
最后,由于您的emsdk已从上述步骤激活,因此您可以使用emconfigure构建Boost,以根据需要配置所有内容,以便对gcc的调用改用emscripten

emconfigure ./b2 toolset=gcc --prefix=<directory_to_install_to> --build-dir=<directory_for_intermediate_build_files>
emconfigure./b2工具集=gcc--prefix=--build dir=
现在要将includes和libs安装到所选的前缀目录,请运行

emconfigure ./b2 toolset=gcc --prefix=<directory_to_install_to> --build-dir=<directory_for_intermediate_build_files> install
emconfigure./b2 toolset=gcc--prefix=--build dir=install

在较新版本的emscripten中,您只需使用添加Boost库即可。现在只需将此标志添加到编译器和链接器中即可:
-s使用\u BOOST\u HEADERS=1

如果您使用的是CMake,可以添加如下标志:

set_target_properties(your_targets_name_here PROPERTIES COMPILE_FLAGS "-s USE_BOOST_HEADERS=1" LINK_FLAGS "-s USE_BOOST_HEADERS=1")

Web后端还是前端?应该是前端。这是一款我希望能在网络浏览器中玩的游戏。我只是好奇一下,当编译成emscripten代码时,会增加多少MB我已经看到了这个问题,这就是为什么我尝试用emscripten编译Boost。我问题中列出的Boost库不仅仅是标题,否则太简单了:)我要试试你的解决方案,我只需要找到如何告诉Boost用
emcc
而不是
gcc
编译。这里也有同样的问题,Boost中的headers-only库可以使用-s使用_Boost_headers=1,但其他库需要手动编译和链接,我在使用emcc或emcmake时遇到了问题,请参阅相关的Great work@julien。您是否尝试使用
user config.jam
而不是硬编码路径?@LCIDFire我对Boost的配置文件不太熟悉,因此没有尝试
user config.jam
。这真的是一个反复试验的过程,在我的游戏运行之前,我还有工作要做。@Julien,谢谢你的帖子,我正在从事一个类似情况的项目,我按照你的建议构建了boost。一个问题是,如何处理仅在头文件中的类/functoid?它们没有内置在静态或共享库中这确实是有希望的,但我遇到了一些问题,例如
错误:在搜索最佳转换时发现歧义,试图从以下位置生成“SEARCHED_LIB”类型:
。。。您是否成功地在OSX上使用Emscripten构建Boost?此错误似乎是由b2查找外部库(如zlib、icu、bzip2等)的方式造成的。我可以通过修改
boost\u 1\u 67\u 0/tools/build/src/build/generators来绕过这个问题
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 toolset=emscripten 
./emsdk install latest && ./emsdk activate latest && source ./emsdk_env.sh
git clone --recursive https://github.com/boostorg/boost.git
cd boost
./bootstrap.sh
emconfigure ./b2 toolset=gcc --prefix=<directory_to_install_to> --build-dir=<directory_for_intermediate_build_files>
emconfigure ./b2 toolset=gcc --prefix=<directory_to_install_to> --build-dir=<directory_for_intermediate_build_files> install
set_target_properties(your_targets_name_here PROPERTIES COMPILE_FLAGS "-s USE_BOOST_HEADERS=1" LINK_FLAGS "-s USE_BOOST_HEADERS=1")