Компиляция с флагами в Makefile

#c #gcc #makefile

#c #gcc #makefile

Вопрос:

Чтобы прояснить ситуацию, давайте предположим, что я компилирую программу ( prg ) из 3 файлов, main.c , person.h и person.c .

Если я использую сжатый способ записи файла makefile, подобный этому (более конкретно, две последние строки):

 prg : main.o person.o
    gcc -Wall -o prg -c $^

main.o : person.h
person.o : person.h
  

Будет ли -Wall Применен к main.o и person.o автоматически? Или это даже не имеет значения?

Я знаю, что, как говорится в файле, если person.o потребуется повторная компиляция, prg также потребуется повторная сборка. Но я не знаю, достаточно ли указать -Wall только в главной цели, чтобы включить другие цели, чтобы предупреждения выдавались по мере компиляции других.

Может быть, я упускаю что-то действительно важное, или я говорю что-то, что не имеет смысла; но успокойтесь, я всего лишь новичок: P

Комментарии:

1. Когда вы запускаете makefile, команды, которые он выполняет для вас, будут отображаться в консоли. Вы можете легко увидеть, какие флаги он использует.

2. Название этого вопроса кажется неправильным. Вопрос о make, а не о флагах gcc.

3. @David Thornley: Я только что отредактировал это, надеюсь, теперь это понятнее. Извините за любую путаницу.

4. Большое вам спасибо. Теперь это намного лучше.

Ответ №1:

Поскольку вы применяете -Wall к фазе компоновки (при сборе объектных файлов в исполняемый файл), но опция применяется к фазе компиляции (преобразование исходных файлов в объектные файлы), она не дает никаких преимуществ там, где она записана.

Вы должны изменить компиляцию, установив макросы.

Обычно правило для компиляции исходного файла C в объектный файл выглядит примерно так:

 ${CC} ${CFLAGS} -c $*.c
  

Там могут быть другие биты, и обозначение может использовать что-то другое, чем $*.c для идентификации исходного файла — существуют похожие (примерно эквивалентные) методы для указания этого, но это не имеет отношения к тому, что я делаю. $(CC) Обозначение также эквивалентно ${CC} .

Итак, чтобы изменить компилятор, вы указываете ‘ CC=new_c_compiler ‘, а чтобы перейти к параметрам компиляции, вы (осторожно) указываете ‘ CFLAGS=-Wall ‘.

Это можно сделать в makefile или в командной строке. Командная строка переопределяет makefile.

Следовательно:

 CFLAGS = -Wall

prg : main.o person.o
    ${CC} ${CFLAGS} -o prg -c $^

main.o : person.h
person.o : person.h
  

Почему осторожно? Потому что в более сложных ситуациях может существовать сложное определение CFLAGS, которое создается из нескольких источников, и беспечная настройка CFLAGS = -Wall может привести к потере ваших путей включения, определений макросов и всего прочего. В вашем случае, похоже, вы можете просто установить его, как показано.

Если вы используете GNU Make, вы можете просто добавить -Wall в CFLAGS :

 CFLAGS  = -Wall
  

Это не обязательно работает со всеми разновидностями make .

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

Ответ №2:

Нет, флаги волшебным образом не будут применены к другим целям.

Добавьте строку, подобную этой, в начало вашего Makefile, над правилами:

 CFLAGS=-Wall
  

Затем попробуйте без явной строки для prg .