Compile Boost 1.47 для Windows CE

На самом деле есть немного информации о людях, пытающихся создать библиотеки Boost для Windows CE, но никто не сообщил об успехах или даже не дал шагов, необходимых для этого. В двух последних выпусках (1.46 и 1.47) в примечаниях к выпуску упоминалось, что одним из их тестовых компиляторов был "Visual С++, Windows Mobile 5, с STLport: 9.0", что, по-видимому, означает, что успех был достигнут (в качестве примечания компилятор интересен тем, что последний STLPort, который я смог скачать, - это 5.2.1. Я что-то упустил?).

Посты, которые я нашел, похоже, вращаются вокруг файла, содержащегося здесь: http://www.boost.org/development/tests/trunk/VeecoFTC.html. Дело в том, что я честно не знаю, как его использовать. Я смог построить STLPort для Windows CE, но после руководства по началу работы с Boost (http://www.boost.org/doc/libs/1_47_0/more/getting_started/windows.html) я застрял на этапе Boost.Build. Должна ли мне конфигурировать на данный момент для компиляции для CE? Я просто не знаю, какие шаги предпринять, и я бы оценил некоторые рекомендации.

Вот шаги, которые я выполнил до сих пор:

  • Скомпилируйте STLPort для Windows CE (документация была довольно приличной, это не оказалось слишком сложным).
  • Установите 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 существует. Я что-то упускаю? Я даже на правильном пути?

UPDATE:

Так как я не могу заставить Boost.Build работать и не получаю любви в списке рассылки Boost.Build, я перешел к попытке создания системы сборки CMake для Boost: 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 не содержит ни одного из них. Как работает ИТ?

Ответы

Ответ 1

На самом деле вам не нужно использовать boost build для создания boost. Я создал часть boost, используя SCons script для проекта, где мне нужно было больше контролировать варианты сборки. Он работал достаточно хорошо. Это произошло примерно так:

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 script просто ищет исходные файлы в перечисленных модулях boost и компилируется с помощью компилятора по умолчанию. Я передаю путь к каталогу источника источника с помощью переменной среды BOOST_SOURCE.

Это может работать для Windows CE, поскольку это даст вам больший контроль над процессом сборки. Вы также можете сделать что-то подобное с make или nmake.

Мораль этой истории заключается в том, что наращивание здания с использованием bjam/BoostBuild не так уж сложно.

Ответ 2

Это ошибка, которую вы увидите, если конфигурация набора инструментов msvc имеет неправильный путь к тому, где установлен набор инструментов. Я видел такие ошибки на 64-битных машинах Windows, где инструменты предполагают, что компилятор установлен в "C:\Program Files", но на самом деле он находится в "C:\Program Files (x86)"

Проверьте конфигурацию набора инструментов и убедитесь, что она соответствует местоположению, где установлен SDK.

Ответ 3

Я с успехом компилирую Boost.Thread, Boost.Regex, Boost.System, Boost.Chrono и Boost.Atomic для Windows CE 6.0 на платформе x86.

Основная работа заключалась в том, чтобы сделать WinCE более совместимым с ANSI C. Я изменил бит STLPort и интегрировал с отсутствующей функцией C. Затем я построил boost с помощью STLPort.

Посмотрите на следующую ссылку, которую я опубликовал:

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

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

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

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