如何使用CMake处理C++项目中预编译头的强制包含?

问题描述 投票:0回答:1

我试图了解如何使用 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

c++ cmake precompiled-headers
1个回答
0
投票

正如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
的编译器输出将自动链接到目标的目标代码,并包含在生成的可执行文件中。

© www.soinside.com 2019 - 2024. All rights reserved.