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

时间:2018-12-29 12:11:04

标签: c++ gcc makefile precompiled-headers

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

更具体地说,我尝试使用GCC 8.1.0文件 lib.hpp.gch 的预编译头文件 main.cpp 编译文件 lib .hpp 在main.cpp中包括作为第一个令牌

lib.hpp已预编译

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

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中怎么了?

1 个答案:

答案 0 :(得分:1)

您不会在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进行编译,这可以确保在{em> lib.hpp.gch

之前始终先搜索lib.hpp