You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Visual Studio会多次编译外部引入的glm库等头文件?

问题原因解释

首先明确:你看到的不是glm/vec3.hpp被重复编译,而是C++编译模型的正常表现:

  • 每个.cpp文件是一个独立的编译单元,头文件不会单独参与编译,只会在被.cpp引入时完整展开到引入位置
  • 头文件的#ifndef防护只能防止同一个编译单元内重复引入同一个头文件,跨编译单元无效
  • 你看到的多次相同警告,是每个引入了GLM头文件的编译单元,在展开头文件内容后,触发了相同的规则检查,所以重复输出警告,不是头文件被重复编译了。
解决方法

有三种常用的方案可以解决这个问题,按优先级推荐如下:

1. 引入第三方头文件时临时屏蔽警告

不用修改GLM源码,直接在你自己的头文件里包裹GLM的引入逻辑即可,针对VS的写法如下:

#ifndef MATH_HH
#define MATH_HH

// 临时保存当前警告等级,将警告等级调到最低屏蔽第三方库警告
#pragma warning(push, 0)
#include <glm/glm.hpp>
#include <glm/gtx/quaternion.hpp>
// 恢复原来的警告等级,不影响你自己代码的警告检查
#pragma warning(pop)

// 你的其他代码
#endif

2. 开启预编译头(PCH)加速编译+避免重复处理

在Visual Studio项目中开启预编译头功能,将GLM这类不会频繁修改的第三方头文件统一放到预编译头里,整个项目只会编译一次这些头文件的内容,所有后续编译单元都会复用预编译的结果,既不会再重复弹出GLM的警告,还能大幅提升全量编译的速度。

3. 将GLM目录标记为系统头文件(VS2017及以上版本支持)

在项目属性中做如下配置:

  • 打开项目属性 -> C/C++ -> 常规 -> 附加包含目录,将原来的GLM根目录路径前添加/external:前缀,比如原来的C:\test\external\glm修改为/external:C:\test\external\glm
  • 打开项目属性 -> C/C++ -> 高级,将「外部头文件警告等级」设置为0,或者在「禁用特定警告」中添加4201即可

配置完成后VS会自动忽略外部目录下头文件的所有警告,不会影响你自己代码的警告检查。

内容的提问来源于stack exchange,提问作者Toothery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:24:03