【问题标题】:Building boost under Visual Studio 2012 with v110_xp platform toolset使用 v110_xp 平台工具集在 Visual Studio 2012 下构建提升
【发布时间】:2013-08-05 09:23:14
【问题描述】:

是否可以使用“v110_xp”平台工具集的b2.exe工具自动构建当前的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

目前似乎没有对此方案的命令行支持。对吗?

【问题讨论】:

    标签: c++ visual-c++ boost visual-studio-2012 boost-build


    【解决方案1】:

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

    更改boost文件夹中以下文件的内容(下载并解压)

    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" (
    

    到:

    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"
    

    到:

    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 &lt;path to boost_1_54_0&gt;

    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%

    cd到样本所在目录,即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
    

    【讨论】:

      【解决方案2】:

      @Paul 和 @Kanchari 的回答对我来说效果很好,直到 Boost 1.55 到来。在那之后,我不得不进行额外的调整。因此,我将@Kanchari 对简单 shell 脚本的回答进行了概括,该脚本无需 Boost 发行版修改即可工作。 在GitHub 上查找完整脚本,这里是从控制台构建手册的步骤(x86 版本,MSVS 默认路径):

      1. 解压 boost 并转到控制台中的根文件夹
      2. 根据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. 根据另一个MSDN set 为 Win XP 定义。 MSDN 说明了您可以定义WINVER_WIN32_WINNT,但是,以防万一,我同时使用两者。在这里小心^

        set XP_TOOLSET_DEFINES=define=WINVER=0x0501 define=_WIN32_WINNT=0x0501 ^
        define=NTDDI_VERSION=0x05010000 define=PSAPI_VERSION=1
        
      4. Build Boost 构建系统

        call bootstrap.bat
        
      5. 使用 b2 和您的项目参数构建 Boost 库。例如 - 调试多线程静态库。

        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 上显示这些说明
      【解决方案3】:

      看起来您可以使用平台工具集 v110 构建 Boost,并在您使用平台工具集 v110_xp 构建的应用程序中使用它们。见:vs2012 toolset compatibility

      不过,我仍然需要对此进行测试。也许其他人在这方面有更多经验。

      【讨论】:

      • 这也是this thread讨论的结果。我已经做了一些测试,看起来不错。
      • 据我所知,这仅适用于静态链接。如果您使用 boost_thread*.dll 所需的动态链接,则需要使用下面答案中描述的相应设置来重建 boost。
      【解决方案4】:

      如果您在 Visaul 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 库运行良好(我们使用了它的自动链接功能)

      Here 是一个指向 boost(1.56,但在 1.57 中相同)windows config header 的链接,用于设置 xp 兼容模式。

      【讨论】:

        猜你喜欢
        • 2014-02-28
        • 1970-01-01
        • 2013-03-05
        • 2013-12-16
        • 2017-07-28
        • 1970-01-01
        • 2014-05-10
        • 2012-08-18
        • 2016-04-26
        相关资源
        最近更新 更多