【问题标题】:How to reduce compilation time with GLM?如何使用 GLM 减少编译时间?
【发布时间】:2022-08-17 22:26:55
【问题描述】:

我正在使用GLM,这是一个库,它提供了一些我在任何地方都使用的低级数学类型和函数。但是使用这个 Visual Studio addon 显示,在每次构建期间,GLM 约占我编译时间的 50%,即大约 30 秒。

文档提到使用“预编译头”来加速编译,但我对这个概念非常不熟悉,并且无法找到关于它们的任何进一步信息。我怎样才能让 GLM 使用预编译的头文件?这会完全减少编译时间吗?

我确实知道如何创建一个静态库 .lib 文件,但我不确定这对于标题/模板重的库是否有用。

(我也对chrono 和mutex 花费大量时间感到困扰。也许这只是必须付出的代价?我已尽力限制它们的编译单元至少包含在内。)

  • 文档here,它非常简单。将您喜欢的任何内容放入预编译的头文件(在您的情况下为 GLM),使用一个 .cpp 文件构建预编译的头文件,其余的 .cpp 文件可以使用构建的预编译头文件。
  • 预编译的头文件基本上在读取一些头文件后转储编译器状态,然后让您重新加载该编译器状态。因此,您只需阅读一组标题一次。缺点当然是如果您更改标头,它会使保存的状态无效,并且您必须在所有文件中包含相同的标头才能使用该状态。但它可以加快构建速度。静态库对仅标头库没有帮助。
  • 您好,很高兴知道您的问题已经解决!请考虑接受它作为答案以将其状态更改为已回答。只是提醒 :)

标签: c++ visual-studio compilation glm-math precompiled-headers


【解决方案1】:

(提交答案以便其他人知道我做了什么,但感谢@john 在 cmets 中的回答)

预编译的标头使我的构建时间从 2 分钟缩短到 10 秒(!)

为了在空项目中使用 Visual Studio 中的“预编译头文件”,我遵循的步骤是:

  • 将pch.h 和pch.cpp 文件添加到项目中。
  • 在pch.cpp的属性中C++->precompiled header下设置为Create (/Yc),头文件名设置为pch.h(你可以自己取名字, stdafx.h 和 pch.h 只是 Visual Studio 将选择的默认名称。)
  • pch.cpp 应该有 #include "pch.h" 因为它是唯一的一行。该编译单元将首先编译并生成所有其他编译单元现在可以重用的编译器状态。
  • 在您希望从预编译头文件中受益的每个*.cpp 文件的属性中(不必是所有文件),您必须进入它们的属性(ctrl+单击或拖动以执行此操作)一次多个文件),并在 C++ -> precompiled header 下将其设置为 Use (/Yu) 并使用相同的 pch.h 标头名称。
  • 您设置为使用预编译头的每个源文件都必须包含pch.h,因为这是第一个操作。这是因为当编译器遇到该行时,它会丢弃它的当前状态(#include "pch.h" 之前的所有内容)并使用它在编译 pch.cpp 单元时生成的状态。
  • 最后,将所有要预编译的头文件和代码放入pch.h,就可以了。

对我来说,我的 pch.h 标头最终看起来像这样:

#pragma once
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <mutex>
#include <chrono>
#include <atomic>
#include <condition_variable>

#include <cstdint>
#include <cstdarg>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <utility>
#include <cmath>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_LEFT_HANDED
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/detail/func_common.hpp>
#include <glm/trigonometric.hpp>
#include <glm/gtc/constants.hpp>
#include <glm/gtc/bitfield.hpp>
#include <glm/gtc/round.hpp>
#include <glm/gtx/rotate_vector.hpp>
#include <glm/gtx/vector_angle.hpp>
#include <glm/gtx/quaternion.hpp>

请注意,我并不是在谈论这个问题的权威,如果有用的话,我只是把我为自己做的事情放在这里;如果有更优雅的方式来做到这一点,我不会感到惊讶。

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多