将Windows上的32位和64位Boost构建到同一个文件夹中

f0ofjuux  于 2021-06-04  发布在  Windows
关注(0)|答案(2)|浏览(176)

我正在寻找config.jam的简单设置,它将使用MSVC在Windows上为x86和x64构建Boost(1.60或更高版本)。理想情况下使用对b2的单个调用-我知道它应该支持从单个调用生成多个输出。对x86和x64进行两个单独的调用是可以的,但不是首选。
另一件事我想让它输出两套库到相同的文件夹。显然,他们需要有不同的名称,所以我希望它把-x64放在x64二进制文件的名称中。它仍然需要自动链接,所以我不能手动重命名它们,它必须是构建系统支持的东西。这一部分是必不可少的。
我有read,b2提供了一个--buildid参数,自动链接支持一个BOOST_LIB_BUILDID定义,它允许插入像这样的自定义关键字,但是我不确定具体如何使用它们。(并通过对b2的单个调用来运行它们),还是这真的需要两个单独的调用?
有人知道咒语吗?

o7jaxewo

o7jaxewo1#

我想这不是人们会做的事。
我已经满足于只运行两次命令;我的工作咒语是这样的

bootstrap
b2 -j8 --build-dir=build               toolset=msvc-14.0 variant=debug,release link=shared threading=multi runtime-link=shared                  stage
b2 -j8 --build-dir=build --buildid=x64 toolset=msvc-14.0 variant=debug,release link=shared threading=multi runtime-link=shared address-model=64 stage

这将把x86和x64库放入stage\lib;对于实际编译应用程序,只需要此文件夹和boost文件夹的内容。然后在构建软件时,将此片段添加到项目文件中(通过props文件):

<PropertyGroup>
    <BoostIncludeDir>path\to\include\boost\</BoostIncludeDir>
    <BoostLibDir>path\to\lib\</BoostLibDir>
</PropertyGroup>
<ItemDefinitionGroup>
  <ClCompile>
    <AdditionalIncludeDirectories>$(BoostIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    <PreprocessorDefinitions>BOOST_ALL_DYN_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    <PreprocessorDefinitions Condition="'$(Platform)'=='x64'">BOOST_LIB_BUILDID=x64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  </ClCompile>
  <Link>
      <AdditionalLibraryDirectories>$(BoostLibDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
  </Link>
</ItemDefinitionGroup>

BOOST_ALL_DYN_LINK在技术上是可选的,但如果您正在编译在其导出的API中具有Boost类型的DLL,则它有助于提高兼容性。但是,您仍然需要确保它们都是使用相同的编译器和Boost版本编译的。)

ki0zmccv

ki0zmccv2#

由于人们在多年后仍然明显地发现这个问题和答案,我可能应该补充说,从Boost 1.67开始,不再需要使用自定义构建ID或构建两次;你可以在一个单独的咒语中为32位和64位构建:

bootstrap
b2 -j8 --build-dir=build toolset=msvc-14.1 cxxflags="-std:c++17" variant=debug,release link=shared threading=multi runtime-link=shared address-model=32,64 stage

props文件本质上是相同的,但没有必要再定义BOOST_LIB_BUILDID
然而,如果你出于其他原因想要多个自定义构建,那么这个被接受的答案可能仍然是你感兴趣的。

相关问题