#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
.