【问题标题】:Compile Boost 1.47 for Windows CE为 Windows CE 编译 Boost 1.47
【发布时间】:2011-09-06 13:26:27
【问题描述】:

实际上有一些关于人们尝试为 Windows CE 构建 Boost 库的信息,但没有人报告成功,甚至没有给出这样做所需的步骤。对于两个最新版本(1.46 和 1.47),发行说明提到他们的一个测试编译器是“Visual C++, Windows Mobile 5, with 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”的。我已经搞砸了吗?

在这一点上,假设我做的事情正确,我需要用类似的东西来运行 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 比对 Windows 更熟悉),我遇到了以下错误:

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 是如何工作的?

【问题讨论】:

  • 你真的使用过任何需要编译的 Boost 库吗? Boost 中有很多有用的库不需要构建。
  • 对,你实际使用了 boost 的哪些部分?我个人只是将 boost 头文件用于 STATIC_ASSERT 和 boost::mpl 等标准功能,这些东西在 WinCE/VC++ 中运行良好。 Boost 是一个庞大的库集合;当然你不需要全部编译成功。
  • 关于“Visual C++, Windows Mobile 5, with STLport: 9.0”, 这是VC++ 9, STLport 交叉编译为WM5。是的,那样看起来很有趣。

标签: c++ boost windows-ce


【解决方案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 来构建 boost 并不难。

【讨论】:

  • 谢谢,我正在调查这个。我会确保发布我找到的任何解决方案!
  • 不幸的是,我也无法获得其他构建方法。我在 Boost CMake 方面取得了更多进展,但我遇到了很多编译问题。也许我只是对 Windows 开发不够了解。让我想念Linux。不过感谢您的帮助:)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我已经在 x86 平台上成功编译了适用于 Windows CE 6.0 的 Boost.Thread、Boost.Regex、Boost.System、Boost.Chrono 和 Boost.Atomic。

    主要的工作是使 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多