我正在尝试将预编译的标头与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] 删除。
我来说两句