Предварительно скомпилированные заголовки, не используемые GCC при сборке с make-файлом - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь использовать предварительно скомпилированные заголовки с GCC, чтобы ускорить процесс компиляции.Если я запускаю компиляцию непосредственно из командной строки, используются предварительно скомпилированные заголовки, но если я пытаюсь организовать компиляцию с использованием make-файла, это не так.

Более конкретно, я пытаюсь скомпилировать с помощью GCC 8.1.0 aфайл main.cpp с использованием предварительно скомпилированного заголовка lib.hpp.gch для файла 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.

Если я напишу make-файл для этого

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 определенно медленнее, чем ручная, подтверждая, что предварительно скомпилированный заголовок не используется.

Что не такв make-файле?

1 Ответ

0 голосов
/ 29 декабря 2018

Вы не включаете PCH нигде в вашей команде make.Попробуйте это:

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

...