为何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
相关产品推荐
相关产品推荐

