Build Boost C ++ WinCE

Я знаю, что это похожий вопрос, но это не помогает мне.
Я хочу построить boost для Windows CE 6 на платформе x86.

Я успешно скомпилировал STLPort в релиз, смоделированный как разделяемая библиотека для WINCE, я также добавил несколько патчей, интегрировал библиотеку OpenCE Time и реализовал некоторые отсутствующие функции ANSI C. Тест STLPort в порядке (просто проблема с функциями wcout, wcin и wcerr in_avail (), я точно не знаю, в чем проблема).

Для создания boost я создал командный файл и изменил user-config.jam таким образом. Сборка в порядке, но кажется, что я компилирую для своей платформы Windows Xp вместо WinCE.

Система форсированной сборки очень сложна, и я не понимаю, как она работает (документация не очень хорошая, а в Google ее почти нет). Сборка boost в порядке, но я не могу запустить приложение. Кажется, что отсутствует какая-либо DLL или что Boos DLL не правы. Когда я присоединяюсь к отладчику, я получаю сообщение «Nessun processo all’estremita ‘della PIPE» -> «Нет процесса в конце PIPE». Когда я пытаюсь запустить приложение с целевого устройства, это не имеет никакого эффекта. Я что-то не так? Как я могу сказать, что boost использует определенную конфигурацию?

Другая проблема в том, что я не вижу журнал сборки. Я не знаю, что именно я строю. Есть ли способ увидеть, что на самом деле делается?

Пакетный файл, который я вызываю для создания boost (запускаю оболочку Visual Studio 2008):

@echo off
cls
bjam --with-chrono --with-date_time --with-thread toolset=msvc-CEPlatformName variant=release threading=multi link=shared runtime-link=shared

Это user-config.jam, расположенный в tools / build / v2

using msvc : CEPlatformName:
<compileflags>-D_CRT_SECURE_NO_WARNINGS
<compileflags>-D_CRT_SECURE_NO_DEPRECATE
<compileflags>-DBOOST_PROTO_MAX_ARITY=10
<compileflags>-DBOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
<compileflags>-DBOOST_MPL_LIMIT_METAFUNCTION_ARITY=10
<compileflags>-D_WIN32_WCE=0x600
<compileflags>-DUNDER_CE
<compileflags>-DWINCE
<compileflags>-Dx86
<compileflags>-D_x86_
<compileflags>-D_UNICODE
<compileflags>-DUNICODE
<linkflags>/subsystem:windowsce,6.00
<linkflags>/MACHINE:X86
<linkflags>/NODEFAULTLIB:oldnames.lib
<linkflags>/NODEFAULTLIB:libc.lib
<linkflags>coredll.lib
<linkflags>corelibc.lib
<linkflags>ole32.lib
<linkflags>oleaut32.lib
<linkflags>uuid.lib
<setup>C:/boost_1_53_0/CEPlatformNameConfig.bat.bat
;using stlport : 5.2 :
C:/celib/stlport/stlport :
C:/celib/stlport/bin
;

И это файл сценария для настройки

@echo off
echo CONFIGURAZIONE PER LA COMPILAZIONE DI BOOST SU WINCE
echo.

rem ------------------------------------------------------------
set BOOST_DIR=c:\boost_1_53_0\boost
set PLATFORM=CEPlatformName
set TARGETCPU=x86
set OSVERSION=WCE600
set STLPORT_DIR=C:\celib\stlport
set STLPORT_INC=%STLPORT_DIR%\stlport
set STLPORT_LIB=%STLPORT_DIR%\bin\%PLATFORM%
rem ------------------------------------------------------------

if not %1==%&TARGETCPU% goto error

echo Setting Boost directory to %BOOST_DIR%
echo Setting OS Platform to %PLATFORM%
echo Setting target CPU to %TARGETCPU%
echo Setting OS Versione to %OSVERSION%
echo Setting STLPORT_INC to %STLPORT_INC%
echo Setting STLPORT_LIB to %STLPORT_LIB%

rem settin visual studio 2008 variable path
set SDKROOT=C:\Programmi\Windows CE Tools

set PATH=%VSINSTALLDIR%\VC\ce\bin\x86_cex86;%VSINSTALLDIR%\VC\bin;%VSINSTALLDIR%\Common7\IDE;%PATH%
set PLATFORMROOT=%SDKROOT%\%OSVERSION%\%PLATFORM%
set INCLUDE=%STLPORT_INC%;%PLATFORMROOT%\include\;%PLATFORMROOT%\include\%TARGETCPU%;%VCINSTALLDIR%\ce\include;%VCINSTALLDIR%\ce\atlmfc\include;%VSInstallDir%\SmartDevices\SDK\SQL Server\Mobile\v3.0;
set LIB=%STLPORT_LIB%;%PLATFORMROOT%\lib\%TARGETCPU%;%VCINSTALLDIR%\ce\ATLMFC\LIB\%TARGETCPU%;%VCINSTALLDIR%\ce\LIB\%TARGETCPU%

echo PATH at %PATH%
echo.

echo INCLUDE is %INCLUDE%
echo.

echo LIB is %LIB%
echo.

goto exit

:error
echo Invali Target CPU
goto exit

:exit
echo impostazioni avvenute con successo

РЕДАКТИРОВАТЬ

Кажется, что флаги компиляции в user-config.jam не имеют никакого эффекта … или лучше кажется, что user-config.jam не имеет никакого эффекта

РЕДАКТИРОВАТЬ 2
Я нашел проблему

using msvc : CEPlatformName :
<compileflags>-D WINCE

Проблема в том, что эта инструкция ничего не определяет. Я также пытался

using msvc : CEPlatformName :
<compileflags>/D_CRT_SECURE_NO_WARNINGS

Но результат тот же.

4

Решение

Я нашел проблему
Наконец, я создаю boost.chrono boost.date_time boost_system и boost.thread для Windows CE 6.0 на специальной цели x86.

Я изменил user-config.jam таким образом

using msvc : 9.0~CEPlatformName : "C:\...\cl.exe" :
<compileflags>-D_CRT_SECURE_NO_WARNINGS
<compileflags>-D_CRT_SECURE_NO_DEPRECATE
...
<setup>CEPlatformNameConfig.bat
;

таким образом, bjam вызывает правильный пакетный файл для настройки системы сборки. Если компилятор не указан, bjam вызовет vcvarsall.bat, а флаги компилятора будут игнорироваться.
Теперь вызов bjam:

bjam ... toolset=msvc-9.0~CEPlatformName ...

Также важно правильно определить `x86` и` _X86_`. Обратите внимание, что `X86` заставит STLPort принять неверный каталог для файлов библиотеки ANSI C.

Но у меня есть проблема с функцией boost :: this_thread :: sleep_for (). Я знаю, что boost использует TLS для этой операции, и я знаю, что TLS не полностью реализован в WinCE. Я могу заменить эту функцию простым :: Sleep () из библиотеки Win32.
Я только уверен, что WinCE имеет функции `TlsAlloc ()`, `TlsFree ()`, `TlsGetValue ()` и `TlsSetValue ()`, и имеет, по крайней мере, слот `TLS_MINIMUM_AVAILABLE` для TLS, который определен как минимум в 64 ,

4

Другие решения

Наконец, я могу собрать Boost.Thread Boost.System Boost.Chrono Boost.DateTime Boost.Regex в режиме отладки и выпуска.

Проблема связана с этим портом (http://stackoverflow.com/questions/16016637/boost-c-and-windows-ce-6-0), что WinCe не поддерживает длинные имена. Имя DLL может быть больше 32 символов.

Та же самая проблема длины имени заставила this_thread :: sleep_for не работать.

Спасибо всем, кто мне помог.

1

По вопросам рекламы [email protected]