我正在尝试构建预编译头文件和可执行文件,方法如下:
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预编译头文件文档,我认为我的编译行正确:
-I./build/
告诉GCC将build
目录添加到包含搜索路径中。-include pch.hpp
在每个文件开头添加一个#include <pch.hpp>
预处理指令。- 编译器为每个
#include
指令搜索带有.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
文件而不是常规头文件的机制不起作用。奇怪。
另外,如果我将src
文件夹添加到头文件搜索路径中,则可以正常工作:
g++ -g -Wall -std=c++17 \
-c ./src/*.cpp \
-I./src/ -I./build/ -include pch.hpp
我不理解为什么添加一个与主题无关的另一个包含路径会解决任何问题。奇怪。
我的当前解决方案是完全删除-I
包含路径指令,并且指定一个更完整的路径到build/pch.hpp
:
g++ -g -Wall -std=c++17 \
-c ./src/*.cpp \
-include ./build/pch.hpp
这个功能正常运作。虽然我不确定为什么需要它,而且它很奇怪和不方便。
这就是PCH的使用方式吗?为什么我的原始代码行不起作用,我应该做些什么?