我试图了解如何使用 CMake 生成和包含预编译头。 目前,我正在利用 CMake 中的
target_precompile_headers
来生成预编译头并将其包含在我的源文件中。这适用于我的 C++ 项目。另一方面,此 CMake 指令会导致强制包含预编译头(如 CMake 文档中所述
头文件列表用于生成名为 cmake_pch.h|xx 的头文件,该头文件用于生成预编译头文件(.pch、.gch、.pchi)工件。 cmake_pch.h|xx 头文件将被强制包含(对于 GCC 为 -include,对于 MSVC 为 /FI)到所有源文件中,因此源文件不需要 #include "pch.h"。
在我的项目中,我目前宁愿避免这种行为。我希望必须在实际使用头文件的源文件中显式包含#include“pch.h”。有没有办法实现这个目标?
考虑一个非常简单的项目结构,其中包含
main.cpp
、pch.cpp
、pch.h
和 CMakeLists.txt
:
main.cpp
//#include "pch.h" //even when the header is not explictly included the code works fine
int main() {
std::vector<double> my_vector;
std::cout << "Size of vector is "<< my_vector.size() << std::endl;
return 0;
}
pch.cpp
#include "pch.h"
pch.h
// pch.h
#ifndef PCH_H
#define PCH_H
#include <vector>
#include <iostream>
#endif // PCH_H
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
add_executable(MyExecutable main.cpp pch.cpp)
target_precompile_headers(MyExecutable PRIVATE pch.h)
target_sources(MyExecutable PRIVATE pch.cpp)
使用此设置,即使
pch.h
未明确包含在 main.cpp
中,一切都可以正常工作。我尝试过 Clang 和 gcc 编译器。有没有办法避免强制包含从而避免这种行为?这应该被视为错误,因为未明确包含 pch.h
。
正如CMake文档中所写:
头文件列表用于生成名为 cmake_pch.h|xx 的头文件,该头文件用于生成预编译头文件(.pch、.gch、.pchi)工件。 cmake_pch.h|xx 头文件将被强制包含(对于 GCC 为 -include,对于 MSVC 为 /FI)到所有源文件中,因此源文件不需要 #include "pch.h"。
因此,
target_precompile_headers
宏会自动将您的标头放入项目的PCH内部列表中,因此pch.h
的编译器输出将自动链接到目标的目标代码,并包含在生成的可执行文件中。