【问题标题】:how can I build the boost libraries from within the Visual C++ IDE?如何从 Visual C++ IDE 中构建 boost 库?
【发布时间】:2016-04-09 22:12:19
【问题描述】:

我的想法是在我的项目中拥有一个单独的位置,我可以在其中编辑整个最终项目的编译器/链接器设置。 这变得很重要,因为在 x64 上存在混合 AVX 而不是 AVX 代码的问题。 如果这(使用 Visual C++ IDE 编译 boost)是不可能的,那么在 boost 构建系统中哪里可以更改编译器设置?

PS。 要使用任何需要的定义编译的 .cpp 文件列表已经足够了。我不明白为什么人们认为开发人员不能从这个(最基本的信息)开始。

PPS。 由于我在这里的一个 cmets(解释了我提出这个问题的动机)已经消失(可能被其中一位“版主”删除),我在这里再次添加它: 如果您不了解一步构建过程的必要性,那么您不应该在这里回答问题或投票。

【问题讨论】:

  • 您应该可以在user-config.jam 中设置编译器选项。我什至不想开始考虑为 boost 的野兽制作功能性视觉工作室解决方案。
  • PS 到底是什么意思?有 30 多个库可以编译,可能有一千个左右的 .cpp 文件(总数接近 10k,但其中包括测试和示例)。尝试重新实现似乎不切实际。正确配置中的脚本编译提升(见上文)。安装到指定位置('avx'、'noavx')。在 Visual Studio 中创建额外的配置,因此有一组(调试、发布等)用于 avx,另一组用于 noavx,并将它们指向特定目录。
  • 您甚至可以修改boostcpp.jam 中的rule tag 以使构建系统适当地命名库(添加-avx-noavx),因此您不需要依赖于拥有多个目录.
  • 在我的构建系统上,我使用 python 脚本构建 3rd 方库,例如 boost、openCV、PCL 等,并使用 devenv 编译 Visual Studio 项目。脚本中给出了构建选项。该脚本由 Jenkins 前端启动。
  • 如果您只使用少量的 boost,那么您可以使用 bcp 将相关部分拉出,然后将它们扔到您的项目中,使用与其余代码相同的标志构建它们.也许检查 .jam 文件,或者运行一次构建并观察它们传递给编译器的选项。您的问题并不完全清楚您对哪个 boost 子集感兴趣。我的观点是整个事情很大,根据我的经验,经常重新编译是不切实际的。

标签: c++ boost boost-build


【解决方案1】:

使用 Boost 的 JAM 构建系统构建库。 Boost 的大部分是不需要显式链接的头文件,但如果需要(线程库、系统等)静态链接到 Visual C++ 中的那些 .lib。

【讨论】:

  • 这会给我一个单一的地方来编辑所有编译器/链接器设置并重新运行重建?
  • 您一次构建 Boost 库以获得一组 .lib。然后在 Visual C++ 中选择要链接到的 .lib。
【解决方案2】:

这很简单.. Boost 由 C++ 源文件和头文件组成。因此:

  1. 将 Boost 根目录添加到您的包含路径。
  2. 对于您使用并拥有 *.cpp 源文件的任何库,只需将这些源文件添加到您的项目中即可。
  3. 查看库的 Boost 构建文件 (Jamfiles),并添加所需的通常最少的定义集。大多数情况下无需添加任何内容。

就是这样。

【讨论】:

    【解决方案3】:

    这很重要,因为在 x64 上存在混合 AVX 而不是 AVX 代码的问题。

    混合 AVX 和 SSE 代码没有问题,只要正确写入 AVX 代码(即在输入 SSE 代码之前清除 ymm 寄存器的高 128 位)。在 SSE 和 AVX 交互方面,x64 并没有什么特别之处。

    如果这(使用 Visual C++ IDE 编译 boost)是不可能的,那么在 boost 构建系统中可以在哪里更改编译器设置?

    即使理论上可行,这也将是一项极其艰巨的任务。构建 Boost 涉及许多检查,每个检查基本上都意味着编译并可能运行测试程序。然后这些检查会影响 Boost 编译。我认为这不可能在 Visual Studio 项目中重现。

    为了在构建 Boost 时指定命令行参数,您可以使用cxxflagscflagslinkflags 选项(参见here),例如:

    b2 variant=release "cxxflags=/arch:AVX" stage
    

    【讨论】:

    • OK -- 我知道如何插入这个 VZEROUPPER。问题是如何将它插入到代码中,因为 AVX 代码可能会调用其余代码,所以在没有 AVX 的情况下编译代码。不——这太麻烦了。我不相信您实际上是为具有 dll 和子进程的复杂项目执行此操作的。但是,如果您自己从未处理过问题,那么仅仅否认提问者的动机会更容易,对吧?
    • 这些检查的结果会随着时间而改变?或者它们类似于与 autobuild/libtool/maketool 相关的配置?所以我可以让这些检查运行一次并从中创建我的项目?
    • 我记得从一位 boost 开发人员那里得到了一些 boost-book 文档。接下来我记得我浪费了好几个小时试图获得 boost-book(或快速书)构建(在 LINUX 上)并最终放弃了。这是几年前的事了——今天可能不一样了。
    • 您是否有任何经验,每个边界处的 VZEROUPPER 多少会减慢计算速度,或者您只是浮动这个?我还没有看到使用它的复杂项目。
    • 是的,我有大型项目使用手动 SIMD 优化的性能关键部件。是的,我们确实在需要的地方使用了 VZEROUPPER/VZEROALL。问题是,您不想从优化的循环中调用 any 代码。如果您绝对必须这样做,那么您无论如何都必须使用这些指令,因为系统的其余部分,包括 C 和 C++ 运行时库,都是在假设 SSE 而不是 AVX 的情况下编译的。 VZEROUPPER/VZEROALL 比没有它们的 AVX 到 SSE 转换的代价要便宜得多。 IIRC,两条指令都需要大约1个周期,所以它们基本上是免费的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2013-10-26
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多