我有一个Visual Studio 2017 C ++项目,该项目使用预编译头文件(stdafx.h)。
我的(简化)文件结构如下:
header1.hpp
header2.hpp
stdafx.h -> includes header1.hpp
code1.cpp -> includes stdafx.h
code2.cpp -> includes stdafx.h and header2.hpp
为了避免含糊不清,请说includes header1.hpp
,我的意思是文件中有一行#include <header1.hpp>
。
修改stdafx.h
后,所有三个文件stdafx.h
,code1.cpp
和code2.cpp
都会重新编译(按预期方式)。
修改code1.cpp
后,只会重新编译code1.cpp
(按预期方式)。
修改header2.cpp
后,重新编译了所有三个文件stdafx.h
,code1.cpp
和code2.cpp
(不期望!)。
我原本期望第3项只编译code2.cpp
,而不是其他所有内容。
此行为的一个可能原因是构建管理器无法检查并遵循#include
指令,因此如果修改了任何头文件,它只会重新编译所有内容。
由于我的项目非常庞大,重新编译code1.cpp
等所有文件会占用大量时间。我故意不包括header2.hpp
中的stdafx.h
,因为我知道我会经常修改header2.hpp
,只有code2.cpp
需要使用它。 (header2.hpp
是一个模板库,只有code2.cpp
个需要的功能。)
是否需要此行为,以及如何让Visual Studio识别其他文件无需重新编译?
答案 0 :(得分:0)
原来我在一年前禁用了预编译的标题(但在项目中留下了stdafx.h
和stdafx.cpp
),当我想再次使用它们时,我忘了打开{{1} }和/Yc
选项。
没有给出任何错误,Visual Studio一直在编译Yu
,就像常规的.cpp文件一样。
另外,我对预编译头文件的工作方式有错误的想法。我认为stdafx.cpp
自己编译编译(然后通过某些中间表示将其转储到stdafx.h
的.cpp文件中),但实际上编译的文件是{{1} (并且在编译时会生成.pch文件)。 (根据this question。)
打开预编译标题选项后,当我修改#include "stdafx.h"
时,只会{}重新编译stdafx.cpp
。
此外,编译时间现在明显加快。