我知道这是类似的问题,但对我没有帮助。 我想在x86平台上构建Windows CE 6的增强功能。
我已经在发布模式下创建STLPort作为WINCE的共享库成功,我还添加了一些补丁并集成了OpenCE Time库并实现了一些缺少的ANSI C函数。 STLPort测试没问题(只是wcout,wcin和wcerr in_avail()函数的一个问题,我不知道确切的问题在哪里)。
为了构建boost,我创建了一个批处理文件并以这种方式更改user-config.jam。构建是好的,但似乎我正在编译我的Windows Xp平台而不是WinCE。
boost构建系统非常复杂,我不理解它是如何工作的(文档不是很好,在google上也没有多少)。 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
但结果是一样的。
答案 0 :(得分:4)
我发现了问题 我终于在自定义x86目标上构建了boost.chrono boost.date_time boost_system和boost.thread 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()函数有一个问题。我知道提升使用TLS进行此操作,我知道在WinCE中没有完全实现TLS。我可以使用Win32库的简单:: Sleep()替换此函数。
我只确定WinCE有`TlsAlloc()`,`TlsFree()`,`TlsGetValue()`和`TlsSetValue()`函数,并且TLS至少有'TLS_MINIMUM_AVAILABLE`槽,至少定义为64 。
答案 1 :(得分:1)
最后,我能够在调试和发布模式下构建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不起作用。
感谢所有帮助过我的人。