Нужно ли явно передавать CFLAGS в gcc?
Я прочитал много уроков о CFLAGS
а также посмотрел в официальных документах. Везде говорят CFLAGS
является неявным, но все же передает его явно в своем примере make-файла компилятору:
CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o
Итак, что означает термин "неявный" в этом контексте? Если я заявляю CFLAGS=-O2
в моем make-файле, а потом просто сказать gcc -c foo.c -o foo.o
, будут -O2
быть активным или нет (так, это действительно неявно)? Если да, то почему все учебные пособия (включая официальные документы) все еще явно передают его в своих примерах?
4 ответа
Везде они говорят, что CFLAGS неявный, но все же явно передают его в своем примере make-файла компилятору.
GCC не использует CFLAGS
переменная окружения. См. Переменные среды, влияющие на GCC.
CFLAGS
это обычное имя для переменной Makefile с флагами C-компилятора, и оно используется неявными правилами make. См. Переменные, используемые неявными правилами, для более подробной информации.
Если вы используете собственные правила make вместо встроенных, вам не нужно использовать CFLAGS
совсем. Хотя это полезное соглашение, потому что люди знакомы с обычными именами переменных make.
Это означает, что существуют неявные правила make, которые используют CFLAGS, которые вы можете использовать. Таким образом, вы можете написать одну строку makefile с помощью:
CFLAGS=-02
если вы позже сделаете:
make filename
(без расширения) он будет использовать неявное правило, которое ссылается на CFLAGS для преобразования исходного файла.c в исполняемый файл, поэтому вам не нужно писать явный оператор сборки для простых сборок.
Например, если вы подготовили файл с исходным именем file.c, он создаст его с неявным правилом, например:
$GCC $CFLAGS file.c -o file $LDFLAGS
смотрите: GNU делает документацию
Я полагаю, что CFLAGS неявно передается в командную строку компилятора make-файлом через правило компиляции по умолчанию... Однако CFLAGS может быть переопределен с помощью пользовательских флагов, так что каждая команда компиляции примет его и будет использовать.
Вы можете проверить это легко:
$ cat cflags.mak
CFLAGS = -wrong
foo.o: foo.c
$ make -f cflags.mak
cc -wrong -c -o foo.o foo.c
cc: unrecognized option '-wrong'
Таким образом, вы можете видеть, что он использовал значение CFLAGS, хотя оно не было явно указано в правиле; таким образом, это неявно.
Но если вы укажете собственное правило для компиляции.c файлов, вы должны включить его, если хотите, чтобы оно использовалось:
$ cat cflags.mak
CFLAGS = -wrong
foo.o: foo.c
gcc -c $<
$ make -f cflags.mak
gcc -c foo.c
Здесь я предоставил свое собственное правило для файлов.c, которые не включали CFLAGS, поэтому CFLAGS не использовался.
Таким образом, суть в том, что если вы полагаетесь на встроенное правило make для компиляции файлов.c, CFLAGS будет включен неявно. Но если вы переопределите это правило, вы должны включить его явно, если вы все еще хотите, чтобы оно использовалось.