CFLAGS по сравнению с CPPFLAGS

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

Но я все еще не понимаю различия.

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

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

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

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

92
задан Mateusz Piotrowski 17 December 2018 в 12:56
поделиться

3 ответа

Неявное правило 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++
144
ответ дан 24 November 2019 в 06:32
поделиться

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

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

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

10
ответ дан 24 November 2019 в 06:32
поделиться
4
ответ дан 24 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: