gpt4 book ai didi

c++ - 使用 makefile 构建时 GCC 不使用的预编译 header

转载 作者:行者123 更新时间:2023-11-28 04:27:25 28 4
gpt4 key购买 nike

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

更具体地说,我尝试使用 GCC 8.1.0 编译文件 ma​​in.cpp,使用文件 lib 的预编译头文件 lib.hpp.gch .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 有什么问题?

最佳答案

您没有在 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 将始终首先搜索 before lib.hpp

关于c++ - 使用 makefile 构建时 GCC 不使用的预编译 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53969396/

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