gpt4 book ai didi

g++ - 为什么g++找不到-I include-path中的预编译头?

转载 作者:行者123 更新时间:2023-12-03 23:14:49 38 4
gpt4 key购买 nike

我正在尝试构建一个预编译的 header 和一个可执行文件,如下所示:

g++ -g -Wall -std=c++17 \
-c ./src/pch.hpp -o ./build/pch.hpp.gch

g++ -g -Wall -std=c++17 \
-c ./src/*.cpp \
-I./build/ -include pch.hpp
pch.hpp.gch文件已正确创建。但是对于每个 .cpp文件,我收到以下错误:
1 error generated.
<built-in>:1:10: fatal error: 'pch.hpp' file not found
#include "pch.hpp"

我认为基于 gcc Precompiled Headers documentation,我的编译行是正确的:
  • -I./build/告诉它将build目录添加到包含搜索路径。
  • -include pch.hpp为每个文件添加了#include <pch.hpp>指令。
  • 编译器为其每个.gch伪指令搜索带有#include后缀的预编译头。

  • 为什么我的编译行无法按预期运行?

    我尝试过的某些方法确实可以给我带来更好的结果,但对我来说看起来并不正确。

    如果我修改包含以搜索.gch文件,则找到该文件,与我期望的一致。也就是 -include pch.hpp.gch,而不是 -include pch.hpp
    但是随后,PCH被解释为二进制文件,并且编译失败:
    g++ -g -Wall -std=c++17 \
    -c ./src/*.cpp \
    -I./build/ -include pch.hpp.gch
    ./build/pch.hpp.gch:2:22: error: source file is not valid UTF-8

    对于 #include <pch.hpp.gch>不编译,我并不感到惊讶。但是我之所以提到这一点,是因为它似乎表明在我的原始命令中搜索了 build文件夹(正如我期望的那样),但是知道使用 .gch文件而不是常规 header 的机制并未处于事件状态。奇怪的。

    或者,如果我将 src文件夹添加到标题搜索路径中,则使用 ,它可以正常工作:
    g++ -g -Wall -std=c++17 \
    -c ./src/*.cpp \
    -I./src/ -I./build/ -include pch.hpp

    我不明白为什么添加另一个不相关的包含路径可以解决任何问题。奇怪的。

    我当前的工作解决方案是完全删除 -I的include-path指令,而 指定一个更完整的build/pch.hpp路径:
    g++ -g -Wall -std=c++17 \
    -c ./src/*.cpp \
    -include ./build/pch.hpp

    这一工作按预期方式进行。不过,我不确定为什么有必要这样做,而且这很奇怪而且很不方便。

    这是应该使用PCH的方式吗?为什么我的原始行不起作用,我打算做什么?

    最佳答案

    documentation:

    A precompiled header file is searched for when #include is seen in the compilation. As it searches for the included file (see Search Path in The C Preprocessor) the compiler looks for a precompiled header in each directory just before it looks for the include file in that directory. The name searched for is the name specified in the #include with ‘.gch’ appended. If the precompiled header file cannot be used, it is ignored.

    For instance, if you have #include "all.h", and you have all.h.gch in the same directory as all.h, then the precompiled header file is used if possible, and the original header is used otherwise.


    这意味着编译器在构建cpp时必须能够同时找到h文件和gch文件。因此,它们都应该在相同的目录或相同的包含搜索路径中。

    关于g++ - 为什么g++找不到-I include-path中的预编译头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918430/

    38 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com