在使用v110_xp平台工具集的Visual Studio 2012中构建boost

3

是否可以使用b2.exe工具为“v110_xp”平台工具集自动构建当前的boost库?

我正在寻找这样的解决方案:

set MSVC_TOOLSET=msvc-11.0_xp
set PLATFORM_TOOLSET=v110_xp

b2 --build-dir="..\32\%PLATFORM_TOOLSET%\build" toolset=%MSVC_TOOLSET% --stagedir="..\32\%PLATFORM_TOOLSET%\lib\Debug" variant=debug

看起来目前没有支持此场景的命令行支持,这是正确的吗?

4个回答

4

这些说明假定您已经安装了Visual Studio 2012或Visual Studio 2012 Express版本以及boost 1.54。

更改下面文件夹中的内容(已下载和提取的):

boost_1_54_0\tools\build\v2\tools中更改以下文件:

1. msvc.jam

更改为:

toolset.flags msvc LINKFLAGS <user-interface>console : /subsystem:console ;

对于32位系统,可以这样做:

toolset.flags msvc LINKFLAGS <user-interface>console : /subsystem:console,5.01 ;

或者对于64位:

toolset.flags msvc LINKFLAGS <user-interface>console : /subsystem:console,5.02 ;

2. msvc.py

变更:

toolset.flags('msvc', 'LINKFLAGS', ['<user-interface>console'], ['/subsystem:console'])

对于32位操作系统,应按照以下步骤进行:

toolset.flags('msvc', 'LINKFLAGS', ['<user-interface>console'], ['/subsystem:console,5.01'])

或者对于64位:

toolset.flags('msvc', 'LINKFLAGS', ['<user-interface>console'], ['/subsystem:console,5.02'])

boost_1_54_0\tools\build\v2\engine 中修改以下文件:

1. build.bat

修改为:

if EXIST "%ProgramFiles%\Microsoft Visual Studio 11.0\VC\VCVARSALL.BAT" (

to:

if EXIST "%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\VC\VCVARSALL.BAT" (

在读取 :Skip_VC11 的那一行上方,修改为:
set "BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib"

to:

set "BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ /D _USING_V110_SDK71_ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib"

打开标准命令提示符并输入以下命令:

call "%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"

set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE%

set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH%

set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB%

cd <path to boost_1_54_0>

bootstrap

对于32位,请使用以下命令:

b2 toolset=msvc-11.0 variant=debug,release link=shared runtime-link=shared address-model=32

或者对于64位:

b2 toolset=msvc-11.0 variant=debug,release link=shared runtime-link=shared address-model=64

为了编译任何样例的发布版本和调试版本,请执行以下操作:
打开标准命令提示符并键入以下命令: call "%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat" set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE% set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH% set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB% 切换到示例所在的目录,即boost_1_54_0\libs\test\tools\console_test_runner
<path to boost>\boost_1_54_0\bjam.exe --v2 toolset=msvc-11.0 variant=debug,release link=shared threading=multi runtime-link=shared

3

@Paul和@Kanchari提供的答案对我很有用,直到出现了Boost 1.55版本。之后,我不得不进行额外的调整。因此,我将@Kanchari的答案概括为一个简单的shell脚本,可以在没有Boost分发修改的情况下工作。 请查看完整脚本:GitHub,以下是从控制台构建手册的步骤(x86版本,MSVS默认路径):

  1. Unpack boost and goto root folder in console
  2. According to MSDN:

    ::setup environment
    call "%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"
    
    ::setup paths
    set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE%
    set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH%
    set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB%
    
    ::cl and linker settings
    set CL=/D_USING_V110_SDK71_ %CL%
    set LINK=/SUBSYSTEM:CONSOLE,5.01 %LINK%
    
  3. According to another MSDN set defines for Win XP. MSDN says what you may define WINVER or _WIN32_WINNT, but, just in case, i use both. Carefully with ^ here.

    set XP_TOOLSET_DEFINES=define=WINVER=0x0501 define=_WIN32_WINNT=0x0501 ^
    define=NTDDI_VERSION=0x05010000 define=PSAPI_VERSION=1
    
  4. Build Boost build system

    call bootstrap.bat
    
  5. Build Boost libraries with b2 and your project params. For example - debug multithread static libraries.

    b2 toolset=msvc-11.0 %XP_TOOLSET_DEFINES% ^
    variant=debug link=static threading=multi runtime-link=shared 
    

重要提示:

在主项目中,除了设置v110_xp工具集之外,还必须定义WINVER_WIN32_WINNT(通过在.cpp文件中使用#define或/D编译器选项)。


bootstrap.bat在VC2013上执行这些指令时失败。 - paulm

2

看起来你可以使用平台工具集v110构建Boost,并在使用平台工具集v110_xp构建的应用程序中使用它们。请参见:vs2012工具集兼容性

不过我仍需要测试一下。也许有人对此更有经验。


1
这也是对此线程讨论的结果。我已经进行了一些测试,看起来很不错。 - mem64k
1
据我所知,这仅适用于静态链接。如果您使用动态链接(例如boost_thread*.dll所需的链接方式),则需要按照下面答案中描述的相应设置重新构建boost。 - fmuecke

1
如果您在 Visual C++ 项目中使用 boost 库,我认为您不需要使用 v110_xp 工具集重新编译 boost。您只需要确保在使用头文件时,WINVER 和 _WIN32_WINNT 设置为正确的版本。BOOST(至少是1.57)默认使用 XP 兼容模式(和 SDK 7.1 等),如果在编译项目时没有设置这些宏,则会出现问题。
对于 VS 2013 和 v120_xp 工具集也是如此。当我们使用 v120_xp 工具集从 VS 2013 编译 VC++ 项目时,其中包括许多外部库,包括 boost,在最初在 Win XP 上无法运行可执行文件。经过大量挖掘,我们发现问题并非是新编译的 boost 库(使用 msvc 12),而是其他某个外部库,我们必须使用 v120_xp 工具集重新编译它。使用 msvc 12 编译的 boost 库工作得很好(我们使用了其自动链接功能)。

这里是一个链接,指向boost库(1.56版本,但在1.57版本中相同)的Windows配置头文件,该文件设置了XP兼容模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接