使用makefile进行构建时,GCC不使用预编译的头文件

征服

我正在尝试将预编译的标头与GCC一起使用,以加快编译过程。如果直接从命令行启动编译,则使用预编译头,但是如果我尝试使用makefile来组织编译,则不使用。

更具体地说,我尝试使用预编译的头文件lib.hpp.gch与GCC 8.1.0一起编译文件main.cpp,以将文件lib.hpp包含在main.cpp中作为第一个标记

lib.hpp已预编译

$ g++ -O2 -H -Wall -std=c++17 -c lib.hpp

然后用main编译main.cpp

$ g++ -O2 -H -Wall -std=c++17 -c main.cpp -o main.o
! lib.hpp.gch
...

我可以从“!”中看到 预编译的lib.hpp.gch实际上已被使用。

如果我为此写一个makefile

CXX = g++
CXXFLAGS = -O2 -H -Wall -std=c++17

main.o: \
    main.cpp \
    main.hpp \
    lib.hpp
    $(CXX) $(CXXFLAGS) \
    -c main.cpp \
    -o main.o

然后使用make,我希望预编译头的用法相同

但是相反,它失败了,如“ x”所示:

$ make
g++ -O2 -H -Wall -std=c++17 \
    -c main.cpp \
    -o main.o
x lib.hpp.gch
...

这很奇怪,因为make发出的命令似乎与我之前手动使用的命令完全相同。

我还对时序进行了测量,可以确认通过make进行的编译肯定比手动编译慢,从而确认未使用预编译的标头。

Makefile中有什么问题?

煤渣饼干

您不会在make命令的任何地方包括PCH。尝试这个:

CXX = g++
CXXFLAGS = -O2 -H -Wall -std=c++17
OBJ = main.o #more objects here eventually I would think!

PCH_SRC = lib.hpp
PCH_HEADERS = headersthataregoinginyourpch.hpp andanother.hpp
PCH_OUT = lib.hpp.gch

main: $(OBJ) 
     $(CXX) $(CXXFLAGS) -o $@ $^

# Compiles your PCH
$(PCH_OUT): $(PCH_SRC) $(PCH_HEADERS)
     $(CXX) $(CXXFLAGS) -o $@ $<

# the -include flag instructs the compiler to act as if lib.hpp
# were the first header in every source file
%.o: %.cpp $(PCH_OUT)
    $(CXX) $(CXXFLAGS) -include $(PCH_SRC) -c -o $@ $<

首先,PCH被编译。然后,所有cpp命令都-include lib.hpp以此为前提进行编译,以确保lib.hpp.gch始终在搜索之前先进行搜索 lib.hpp

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用jar进行归档时无效的头文件

如何使用保存的发布配置文件构建TFS构建以预编译Web应用程序?

使用GCC和手动Makefile进行增量构建?

在qmake中进行编译之前,如何使用可执行文件构建多个头文件?

Xcode无法发出预编译头文件?

使用gcc链接目标文件之前进行编译时出错

更改头文件时,如何使Makefile重新编译?

VS总是寻找预编译的头文件

uWSGI是否使用预编译的Python文件?

structs,typedefs和c头文件;如何不使用.c文件进行集成

如何使用多个预编译头文件;一些来自图书馆

使用CMake进行编译时,更改头文件的位置会导致丢失vtable错误

gcc预编译头文件:pragma出现在主文件中

使用Makefile中的头文件编译Pybind(不使用cmake)

使用gcc进行编译会导致Docker构建失败

如何在不使用GCC中的limit.h头文件的情况下编译C程序?

使用编译时不可用的头文件

对于干净的构建,预编译的头文件是否可以比经典包含的文件慢?

使用xctool指定预编译的头文件目录

使用makefile进行编译时,如何在不使用命令“ make clean”的情况下清除目标文件?

如何使用gcc / g ++编译多个cpp文件头文件?

使用GCC包含文件时编译失败

如何为Windows使用libjsonrpc-cpp的预编译依赖项?#include头文件给出错误

Makefile-使用修改后的头文件进行重建

包括标准库时,不使用预编译头

如何使用 Makefile 正确编译带有头文件的 C++?

Visual Studios,在 C 代码中使用预编译头文件

强制 CMake 重建预编译头文件

在 Ubuntu WSL 中使用 gcc 编译 .c 和头文件时遇到问题