为Windows CE编译Boost 1.47

时间:2011-09-06 13:26:28

标签: c++ boost windows-ce

实际上有一些关于人们试图为Windows CE构建Boost库的信息,但没有人报告成功,甚至没有给出这样做所需的步骤。有了这两个最新版本(1.46和1.47),发行说明中提到他们的一个测试编译器是“Visual C ++,Windows Mobile 5,STLport:9.0”,这似乎意味着已经取得了成功(作为旁注)给出的编译器很有意思,因为我能够下载的最新STLPort是5.2.1。我错过了什么吗?)。

我发现的帖子似乎围绕着此处包含的文件:http://www.boost.org/development/tests/trunk/VeecoFTC.html。问题是,老实说,我不知道如何使用它。我能够为Windows CE构建STLPort,但是按照Boost入门指南(http://www.boost.org/doc/libs/1_47_0/more/getting_started/windows.html),我陷入了Boost.Build阶段。此时我是否需要配置为CE编译?我只是不知道采取什么步骤,并希望得到一些指导。

这是我到目前为止所遵循的步骤:

  1. 为Windows CE编译STLPort(文档相当不错,这并不太难)。
  2. 根据入门指南安装Boost.Build。我在这一步上有点不稳定,因为bootstrap.bat文件似乎特定于“ntx86”和“ntx86_64”。我已经搞砸了吗?
  3. 此时,假设我已经完成了正确的事情,我需要运行类似

    的b2
    b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage
    

    我假设我的构建目录是我用于Boost.Build的前缀,构建类型和阶段将保持给定,但我不知道要使用什么工具集名称。 VeecoFTC文件有多个msvc和stlport条目。我删除了与“wm5”无关的两个条目,但是当我使用以下命令编译时

    b2 --build-dir=C:\boost-build toolset=msvc --build-type=complete stage
    

    我收到一堆错误,如:

    compile-c-c++ C:\boost-build\boost\bin.v2\libs\regex\build\msvc-9.0~wm5~stlport5.2\debug\threading-multi\has_icu_test.obj
    The system cannot find the path specified.
    

    实际上,该文件不存在,但has_icu_test.obj.rsp存在。我错过了什么吗?我甚至走在正确的轨道上吗?

    更新:

    由于我无法让Boost.Build工作而且对Boost.Build邮件列表没有爱,我已经开始尝试使用Boost的CMake构建系统:http://gitorious.org/boost/cmake。我和CEgcc一起使用它(我比Linux更熟悉Linux),我遇到了以下错误:

    boost/config/requires_threads.hpp:47:5: error: #error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
    

    -mthreads是C和CXX标志的一部分 - 问题是BOOST_PLATFORM_CONFIG不是由boost / config / select_platform_config.hpp定义的。应该为Windows CE定义什么?我认为它应该是boost / config / platform / win32.hpp(然后定义BOOST_HAS_WINTHREADS,这将解决上述错误)。当select_platform_config.hpp似乎不能处理Windows CE案例时,发行说明如何声称这可行?如果BOOST_PLATFORM_CONFIG确实需要是boost / config / platform / win32.hpp,那么我需要定义_WIN32, WIN32 或WIN32。我的第一反应是这些都不应该用于编译CE。此外,VeecoFTC文件不包含任何这些。 IT如何运作?

3 个答案:

答案 0 :(得分:1)

您实际上不必使用boost build来构建boost。我使用SCons脚本为一个项目构建了一部分boost,我需要更多地控制构建选项。它工作得很好。它是这样的:

import os

env = Environment()

boost_source = os.environ.get('BOOST_SOURCE', None)
if not boost_source:
    raise Exception, 'BOOST_SOURCE not set'

env.Append(CPPPATH = [boost_source])

if env['PLATFORM'] == 'win32':
    env.Append(CPPDEFINES = ['BOOST_ALL_NO_LIB'])


VariantDir('build', boost_source + '/libs')

import glob
import re

for lib in ['iostreams', 'filesystem', 'system', 'regex', 'thread',
            'serialization']:
    src = []
    path = boost_source + '/libs/%s/src' % lib

    if lib == 'thread':
        if env['PLATFORM'] == 'win32':
            src.append(path + '/tss_null.cpp')
            path += '/win32'
            env.Append(CPPDEFINES = ['BOOST_HAS_WINTHREADS',
                                     'BOOST_THREAD_BUILD_LIB'])
        else: path += '/pthread'

    src += glob.glob(path + '/*.cpp')

    src = map(lambda x: re.sub(re.escape(boost_source + '/libs'), 'build', x),
              src)

    libname = 'boost_%s' % lib
    if env['PLATFORM'] == 'win32': libname = 'lib' + libname
    lib = env.Library('lib/' + libname, src)

Clean(lib, 'build')
Clean(lib, 'lib')

此SCons脚本只搜索列出的boost模块中的源文件,并使用默认编译器进行编译。我通过BOOST_SOURCE环境变量传递到boost源目录的路径。

这可以用于Windows CE,因为它可以让您更好地控制构建过程。你也可以用make或nmake做类似的事情。

故事的寓意是,使用bjam / BoostBuild进行构建提升并不是那么难。

答案 1 :(得分:0)

如果msvc工具集配置的工具集安装位置不正确,则会出现这种错误。我在64位Windows机器上看到过这样的错误,其中工具假设编译器安装在“C:\ Program Files”中,但实际上它位于“C:\ Program Files(x86)”

检查工具集配置并确保它与SDK的安装位置相匹配。

答案 2 :(得分:0)

我在x86平台上成功编译了Boost.Thread,Boost.Regex,Boost.System,Boost.Chrono和Boost.Atomic for Windows CE 6.0。

主要工作是让WinCE更符合ANSI C标准。我改变了一点STLPort并与缺少的C函数集成。然后我用STLPort构建了boost。

看看我发布的以下链接:

http://stackoverflow.com/questions/15906901/build-boost-c-wince

http://stackoverflow.com/questions/16016637/boost-c-and-windows-ce-6-0

http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-runtime-link-to-debug-dll-mdd

http://stackoverflow.com/questions/11079337/wince-5-0-using-stlport-void-operator-newsize-t-void-already-has-a-body/15814730#15814730