【问题标题】:Build Boost C++ WinCE构建 Boost C++ WinCE
【发布时间】:2013-04-09 16:02:27
【问题描述】:

我知道这是类似的问题,但对我没有帮助。 我想在 x86 平台上为 Windows CE 6 构建提升。

我已经成功地在发布模式中构建了 STLPort 作为 WINCE 的共享库,我还添加了一些补丁并集成了 OpenCE 时间库并实现了一些缺少的 ANSI C 函数。 STLPort 测试没问题(只是 wcout、wcin 和 wcerr in_avail() 函数的问题,我不知道问题出在哪里)。

为了构建 boost,我创建了一个批处理文件并以这种方式更改了 user-config.jam。构建没问题,但似乎我正在为我的 Windows Xp 平台而不是 WinCE 编译。

boost 构建系统非常复杂,我不明白它是如何工作的(文档不是很好,在谷歌上也没有太多)。 boost的构建还可以,但我无法运行应用程序。似乎缺少某些 DLL 或 Boos DLL 错误。当我与调试器连接时收到的消息是“Nessun processo all'estremita' della PIPE”->“PIPE 末尾没有进程”。当我尝试从目标设备启动应用程序时,它不起作用。我错了吗?如何告诉 boost 使用特定配置?

另一个问题是我看不到构建日志。我不知道我到底在建造什么。有没有办法查看实际做了什么?

我调用来构建 boost 的批处理文件(我启动了 Visual Studio 2008 的 shell):

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

这是位于 tools/build/v2 中的 user-config.jam

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 中的 compileflags 没有效果......或者更好的是似乎 user-config.jam 没有效果

编辑 2 我发现了一个问题

using msvc : CEPlatformName :
        <compileflags>-D WINCE

问题是这条指令没有定义任何东西。我也试过了

using msvc : CEPlatformName :
        <compileflags>/D_CRT_SECURE_NO_WARNINGS

但结果是一样的。

【问题讨论】:

  • “我无法运行应用程序”是什么意思?什么应用?运行bjam 行后,您是否获得了boost 库?你看到任何错误吗?尝试通过将 ` > result.txt` 附加到 bjam 行的末尾来将 bjam 输出重定向到某个文件。
  • 似乎 boost 是为 Windows Xp 而不是为 windows ce 编译的
  • 我没有构建错误。我已经将输出重定向到文本文件中
  • 如果你已经解决了一个问题——回答你自己的问题。请不要将答案放入问题本身,也不要将标题更改为包含“已解决!!!”任何类型的。
  • 完成。谢谢你的建议

标签: c++ boost windows-ce


【解决方案1】:

我找到了问题
我终于在自定义 x86 目标上构建 boost.chrono boost.date_time boost_system 和 boost.thread fow Windows CE 6.0。

我以这种方式更改了 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 中没有完全实现。我可以用 Win32 库的简单 ::Sleep() 替换这个函数。
我只确定 WinCE 有 `TlsAlloc()`、`TlsFree()`、`TlsGetValue()` 和 `TlsSetValue()` 函数,并且至少有 `TLS_MINIMUM_AVAILABLE` 用于 TLS 的插槽,至少定义为 64 .

【讨论】:

    【解决方案2】:

    最后,我能够在调试和发布模式下构建 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 不起作用。

    感谢所有帮助过我的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2013-06-28
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多