C++ Makefile, похоже, не применяет флаги оптимизации `g++` ⇐ C++
-
Anonymous
C++ Makefile, похоже, не применяет флаги оптимизации `g++`
Для компиляции кода C++ я использовал следующий Makefile, который мне передали.
CXX := g++-11 CXXFLAGS := -std=c++20 -D_FILE_OFFSET_BITS=64 -fopenmp -Wall -Wextra -Wpedantic -Wold-style-cast -Wshadow -Wcast-qual -Wwrite-strings -Wdisabled-optimization -Wfloat-equal -Wformat=2 -Wformat-overflow -Wformat-truncation -Wundef -fno-common -Wconversion -fdiagnostics-show-option -fdiagnostics-color=auto -Wuninitialized -Wno-unused-function -fstrict-aliasing -D_FORTIFY_SOURCE=2 -fstack-protector-strong -Wno-unused -Wno-unused-result -Wno-unused-parameter -Wcast-align -Wnon-virtual-dtor -Woverloaded-virtual -Wmisleading-indentation -Wduulated-cond -Wduulated-branches -Wologic-op -Wnull-разыменование -Wuseless-cast -Wдвойное продвижение CXXFLAGS += -MMD -MP ЛДФЛАГС := -L LDLIBS := -lm -lrt -lpthread SANITIZER := -fsanitize=адрес, утечка, не определено CXXDEBUG := -g -fno-omit-frame-pointer -fanalyzer -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC CXXRELEASE := -DNDEBUG -O2 СОЗДАТЬ ФЛАГИ := -j SRC := $(подстановочный знак *.cpp) OBJ := $(SRC:.cpp=.o) DEP := $(SRC:.cpp=.d) ОТЛАДКА := $(SRC:.cpp=.dbg) ВЫПУСК := $(SRC:.cpp=.rel) .PHONY: все чисто все: $(DEBUG) $(RELEASE) ifneq ($(MAKECMDGOALS), clean, install) # не создавайте .d для целей очистки и установки -включить $(DEP) конец %.dbg:%.o $(CXX) $(CXXFLAGS) $(CXXDEBUG) $(SANITIZER) $< -o $@ $(LDFLAGS) $(LDLIBS) %.rel:%.o $(CXX) $(CXXFLAGS) $(CXXRELEASE) $< -o $@ $(LDFLAGS) $(LDLIBS) чистый: $(RM) $(OBJ) $(DEP) $(RELEASE) $(DEBUG) *~ *.out *.dbg *.rel compile_commands.json *.d Похоже, что Makefile автоматически сканирует все измененные файлы .cpp и компилирует каждый из них в отладочную сборку и выпускную сборку с типами файлов .dbg и >.rel соответственно. Однако недавно я заметил, что флаг оптимизации -O2 в CXXRELEASE, похоже, не применяется к сборке выпуска. Я обнаружил это, когда понял, что компиляция кода с помощью одной только команды g++-11 -std=c++20 -O2 main.cpp` привела к созданию исполняемого файла, который был на порядок быстрее, чем .rel. произведено производителем.
Может ли кто-нибудь понять, что не так с этим Makefile? Я сейчас в большом замешательстве, потому что использую это уже много лет и никогда не осознавал и не замечал этой проблемы, пока несколько дней назад.
Для компиляции кода C++ я использовал следующий Makefile, который мне передали.
CXX := g++-11 CXXFLAGS := -std=c++20 -D_FILE_OFFSET_BITS=64 -fopenmp -Wall -Wextra -Wpedantic -Wold-style-cast -Wshadow -Wcast-qual -Wwrite-strings -Wdisabled-optimization -Wfloat-equal -Wformat=2 -Wformat-overflow -Wformat-truncation -Wundef -fno-common -Wconversion -fdiagnostics-show-option -fdiagnostics-color=auto -Wuninitialized -Wno-unused-function -fstrict-aliasing -D_FORTIFY_SOURCE=2 -fstack-protector-strong -Wno-unused -Wno-unused-result -Wno-unused-parameter -Wcast-align -Wnon-virtual-dtor -Woverloaded-virtual -Wmisleading-indentation -Wduulated-cond -Wduulated-branches -Wologic-op -Wnull-разыменование -Wuseless-cast -Wдвойное продвижение CXXFLAGS += -MMD -MP ЛДФЛАГС := -L LDLIBS := -lm -lrt -lpthread SANITIZER := -fsanitize=адрес, утечка, не определено CXXDEBUG := -g -fno-omit-frame-pointer -fanalyzer -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC CXXRELEASE := -DNDEBUG -O2 СОЗДАТЬ ФЛАГИ := -j SRC := $(подстановочный знак *.cpp) OBJ := $(SRC:.cpp=.o) DEP := $(SRC:.cpp=.d) ОТЛАДКА := $(SRC:.cpp=.dbg) ВЫПУСК := $(SRC:.cpp=.rel) .PHONY: все чисто все: $(DEBUG) $(RELEASE) ifneq ($(MAKECMDGOALS), clean, install) # не создавайте .d для целей очистки и установки -включить $(DEP) конец %.dbg:%.o $(CXX) $(CXXFLAGS) $(CXXDEBUG) $(SANITIZER) $< -o $@ $(LDFLAGS) $(LDLIBS) %.rel:%.o $(CXX) $(CXXFLAGS) $(CXXRELEASE) $< -o $@ $(LDFLAGS) $(LDLIBS) чистый: $(RM) $(OBJ) $(DEP) $(RELEASE) $(DEBUG) *~ *.out *.dbg *.rel compile_commands.json *.d Похоже, что Makefile автоматически сканирует все измененные файлы .cpp и компилирует каждый из них в отладочную сборку и выпускную сборку с типами файлов .dbg и >.rel соответственно. Однако недавно я заметил, что флаг оптимизации -O2 в CXXRELEASE, похоже, не применяется к сборке выпуска. Я обнаружил это, когда понял, что компиляция кода с помощью одной только команды g++-11 -std=c++20 -O2 main.cpp` привела к созданию исполняемого файла, который был на порядок быстрее, чем .rel. произведено производителем.
Может ли кто-нибудь понять, что не так с этим Makefile? Я сейчас в большом замешательстве, потому что использую это уже много лет и никогда не осознавал и не замечал этой проблемы, пока несколько дней назад.
Мобильная версия