CFLAGS против CPPFLAGS - PullRequest
       62

CFLAGS против CPPFLAGS

91 голосов
/ 03 мая 2010

Я понимаю, что CFLAGS (или CXXFLAGS для C ++) предназначены для компилятора, тогда как CPPFLAGS используется препроцессором.

Но я до сих пор не понимаю разницу.

Мне нужно указать путь включения для заголовочного файла, который включается в #include - поскольку #include - это директива препроцессора, препроцессор (CPPFLAGS) - единственное, что меня волнует?

При каких обстоятельствах мне нужно указать компилятору дополнительный путь включения?

В общем, если препроцессор находит и включает в себя необходимые заголовочные файлы, зачем вообще нужно сообщать о дополнительных каталогах include? Какая польза от CFLAGS вообще?

(В моем случае я обнаружил, что ОБА из них позволяет мне скомпилировать мою программу, что добавляет путаницы ... Я могу использовать CFLAGS ИЛИ CPPFLAGS для достижения моей цели (по крайней мере, в контексте autoconf). Что дает?)

Ответы [ 3 ]

143 голосов
/ 03 мая 2010

Неявное правило make для компиляции программы на C:

%.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

где синтаксис $() расширяет переменные. Так как CPPFLAGS и CFLAGS используются в вызове компилятора, который вы используете для определения путей включения, это вопрос личного вкуса. Например, если foo.c - это файл в текущем каталоге

make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"

будет вызывать ваш компилятор одинаково, а именно

gcc -I/usr/include -c -o foo.o foo.c

Разница между ними проявляется, когда у вас есть несколько языков, которым требуется один и тот же путь включения, например, если у вас есть bar.cpp, тогда попробуйте

make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"

тогда компиляции будут

g++ -I/usr/include -c -o bar.o bar.cpp
g++ -c -o bar.o bar.cpp

в качестве неявного правила C ++ также используется переменная CPPFLAGS.

Это различие дает вам хорошее руководство для использования - если вы хотите, чтобы флаг использовался для всех языков, укажите его в CPPFLAGS, если для определенного языка, укажите его CFLAGS, CXXFLAGS и т. Д. Примеры последнего типа включают стандартные флаги соответствия или предупреждения - вы не хотели бы передавать -std=c99 вашему компилятору C ++!

После этого вы можете получить что-то подобное в вашем make-файле

CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
10 голосов
/ 03 мая 2010

Макрос CPPFLAGS используется для указания #include каталогов.

И CPPFLAGS, и CFLAGS работают в вашем случае, потому что правило make (1) объединяет как предварительную обработку, так и компиляцию в одной команде (поэтому в команде используются оба макроса).

Вам не нужно указывать . в качестве включаемого каталога, если вы используете форму #include "...". Вам также не нужно указывать стандартный каталог компилятора. Вам нужно указать все остальные каталоги include.

4 голосов
/ 03 мая 2010
...