Является ли оптимизация и создание отладочной информации частью компиляции или компоновки - PullRequest
0 голосов
/ 22 августа 2009

Я читаю Makefile от кого-то другого следующим образом.

LDFLAGS=-lm -ljpeg -lpng

ifeq ($(DEBUG),yes)
        OPTIMIZE_FLAG = -ggdb3 -DDEBUG -fno-omit-frame-pointer
else
        OPTIMIZE_FLAG = -ggdb3 -O3
endif

CXXFLAGS = -Wall $(OPTIMIZE_FLAG)

all: test

test: test.o source1.o source2.o
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

Makefile.depend: *.h *.cc Makefile
        $(CC) -M *.cc > Makefile.depend

clean:
        \rm -f test *.o Makefile.depend

-include Makefile.depend

Вот мои вопросы:

  1. Хотя это не явно, используется ли $ (CXXFLAGS) неявным правилом, не показанным в этом Makefile во время компиляции для генерации объектных файлов?

  2. Мне также интересно, почему $ (CXXFLAGS) появляется на этапе связывания? Я думаю, что это только для стадии компиляции? Могу ли я удалить $ (CXXFLAGS) из "$ (CXX) $ (CXXFLAGS) -o $ @ $ ^ $ (LDFLAGS)"? Если я не прав, значит ли это, что g ++ также генерирует отладочную информацию и выполняет оптимизацию при связывании?

  3. Зачем использовать -ggdb3 -O3 вместе для целей отладки? Какова его цель? Если просто подумать об улучшении скорости, то не лучше ли использовать -O3?

  4. для целей отладки, как совместное использование -ggdb3 -fno-omit-frame-pointer будет лучше, чем только -ggdb3? Я пытаюсь понять цель -fno-omit-frame-pointer, читая документ gcc, но все еще в замешательстве.

  5. можно ли переместить "-include Makefile.depend" так, чтобы оно было чуть меньше "$ (CC) -M * .cc> Makefile.depend" и выше "clean"? Имеет ли значение его позиция в Makefile?

1 Ответ

2 голосов
/ 22 августа 2009

CXXFLAGS используется неявным правилом. Выполните make -n -p, чтобы увидеть полный список переменных и правил, которые Make генерирует из своих внутренних наборов правил и файла make.

-g параметры отладки используются только на этапе компиляции. -O опции, возможно, используются на этапах компиляции и компоновки. Вы можете использовать оба вместе. С моей страницы руководства gcc:

GCC позволяет использовать -g с -O. Ярлыки, используемые оптимизированным кодом может иногда вызывать удивление Результаты: некоторые переменные, которые вы объявили, могут вообще не существовать; поток контроля может ненадолго переместиться туда, где вы этого не сделали ожидать этого; немного операторы не могут быть выполнены, потому что они вычисляют константу результаты или их значения уже были под рукой; некоторые государственные Элементы могут выполняться в разных местах, потому что они были вышел из петель.

Тем не менее, оказывается возможным отладить оптимизированный вывод. Это делает разумным использование оптимизатор для программ, которые могут содержать ошибки.

-fno-omit-frame-pointer фактически снижает оптимизацию. Оптимизация может помешать отладке, и тот, кто написал этот make-файл, явно намеревался запустить отладчик на оптимизированном коде. Если вам неясно из руководства gcc, как он работает, вы можете захотеть в субботу сесть за справочное руководство по архитектуре Intel или AMD и узнать о вызовах функций и передаче аргументов на уровне инструкций. (Опять же, может и нет. :))

Положение имеет значение в Makefiles. Я бы оставил этот файл в конце. В противном случае существует риск нарушения проверки включаемого файла.

...