опции оптимизации и отладки в Makefile - PullRequest
1 голос
/ 27 августа 2009

Интересно, куда поместить опции оптимизации и отладки в Makefile: этап компоновки или этап компиляции? Я читаю Makefile:

ifeq ($(STATIC),yes)
  LDFLAGS=-static -lm -ljpeg -lpng -lz
else
  LDFLAGS=-lm -ljpeg -lpng
endif

ifeq ($(DEBUG),yes)
  OPTIMIZE_FLAG = -ggdb3 -DDEBUG
else
  OPTIMIZE_FLAG = -ggdb3 -O3
endif

ifeq ($(PROFILE),yes)
  PROFILE_FLAG = -pg
endif

CXXFLAGS = -Wall $(OPTIMIZE_FLAG) $(PROFILE_FLAG) $(CXXGLPK)

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

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

clean:
    \rm -f absurdity *.o Makefile.depend TAGS

-include Makefile.depend

Что меня удивляет, так это то, что CXXFLAGS используется в ссылках. Я знаю, что он также используется в неявном правиле для компиляции для генерации файлов .o, но нужно ли использовать его снова для компоновки? В частности, куда я должен поместить оптимизацию и отладку: этап компоновки или этап компиляции?

1 Ответ

1 голос
/ 27 августа 2009

Краткий ответ:

  • оптимизация: необходимо во время компиляции

  • флаг отладки: необходим во время компиляции

  • символы отладки: необходимо как во время компиляции, так и во время компоновки

Обратите внимание, что компоновщик решает, какие биты каждого объектного файла и библиотеки должны быть включены в конечный исполняемый файл. Он может выбрасывать символы отладки (я не знаю, каково поведение по умолчанию), поэтому вам нужно сказать, что нет.

Далее, компоновщик будет молча игнорировать параметры, которые не относятся к нему.


На комментарии:

Выше приведены очень общие утверждения, основанные на знании того, что происходит на каждой стадии компиляции, поэтому нет ссылок.

Еще несколько деталей:

  • оптимизация: принимает две основные формы: оптимизация глазка может произойти очень поздно, потому что он работает с несколькими инструкциями по сборке за раз (я предполагаю, что в GNU цепочка инструментов, ассемблер отвечает за этот шаг), но большие преимущества заключаются в структурной оптимизации, которая обычно достигается путем переписывания абстрактного синтаксического дерева (AST), которое возможно только во время компиляции.

  • флаг отладки: В вашем примере это директива препроцессора , которая влияет только на первую часть процесса компиляции.

  • символы отладки: Посмотрите t в формате файла ELF (например), вы увидите, что различные биты кода и данных организованы в разные блоки. Символы отладки хранятся в том же файле вместе с кодом, к которому они относятся, но обязательно хранятся отдельно от фактического кода. Таким образом, любая программа, которая манипулирует этими файлами, может просто сбросить ее. Поэтому и компилятор и компоновщик должны знать, хотите вы их или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...