CFLAGS, CCFLAGS, CXXFLAGS - что именно контролируют эти переменные?



я использую GNU make для компиляции моего кода на C++, и я хотел бы понять, как сделать мои компиляции настраиваемыми.



я читал в разных местах, что CFLAGS,CCFLAGS и CXXFLAGS используются для этой цели. Так как же мне их использовать? Если у меня есть дополнительные аргументы командной строки для компилятора, я должен добавить их в CFLAGS или добавить их? Есть ли общая практика?



почему три разные переменные? Я полагаю, что компилятор C должен получить CFLAGS и CCFLAGS, в то время как компилятор C++ должен получить CFLAGS и CXXFLAGS - Я правильно понял?



должен ли человек-пользователь вообще устанавливать эти переменные? Сделайте любые автоматические инструменты (automake,autoconf и т. д.) установить их? Система linux, которую я должен использовать, не определяет ни одну из этих переменных - это типично?



в настоящее время мой Makefile выглядит так, и я чувствую, что это немного грязно:



ifdef code_coverage
GCOV_FLAG := -fprofile-arcs -ftest-coverage
else
GCOV_FLAG :=
endif

WFLAGS := -Wall

INC_FLAGS := -Istuff -Imore_stuff -Ietc

CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)

... (somewhere in the makefile, the command-line for compilation looks like this)
$(CC) $(CCFLAGSINT) -c $< -o $@

... (somewhere in the makefile, the command-line for linking looks like this)
$(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@


я уверен, что здесь нет ошибок; Файл Makefile работает очень хорошо. Но есть ли что-нибудь, что идет вразрез с конвенциями (например,CCFLAGSINT - Я должен просто перезаписать CCFLAGS вместо? Или CXXFLAGS? ФАД!)



извините за так много вопросов; вы, очевидно, не ответите на них все, но я надеюсь, что ответы помогут мне понять общую идею этих настроек.

1081   2  

2 ответов:

как вы заметили, это Makefile {макросы или переменные}, а не параметры компилятора. Они реализуют ряд соглашений. (Макросы-старое название для них, до сих пор используется некоторыми. GNU make doc называет их переменными.)

единственная причина, по которой имена имеют значение, - это правила make по умолчанию, видимые через make -p, которые используют некоторые из них.

если вы пишете все свои собственные правила, вы можете выбрать все свои собственные имена макросов.

в ванильном gnu make такого нет вещь как CCFLAGS. Есть CFLAGS,CPPFLAGS и CXXFLAGS. CFLAGS для компилятора C, CXXFLAGS для C++, и CPPFLAGS для обоих.

почему CPPFLAGS в обоих? Условно, это дом флагов препроцессора (-D,-U) и оба c и c++ используют их. Теперь, предположение, что все хочет то же самое определение среды для c и c++, возможно, сомнительно, но традиционно.


P. S. Как отметил Джеймс Мур, некоторые проекты используют добейтесь того, для флагов для компилятора C++, а не флаги препроцессора языка Си. Android NDK, для одного огромного примера.

по словам GNU make руководство:

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

src:https://www.gnu.org/software/make/manual/make.html#index-CFLAGS
Примечание: PP означает препроцессор (а не плюс плюс), т. е.

CPP: программа для запуска препроцессора C, с результатами на стандартный вывод; по умолчанию ‘$(CC) -E’.

эти переменные используются неявными правилами make

компиляция программ на C
n. o производится автоматически из n. c с рецептом вида
‘$(Куб. см) $(переменные cppflags) $(переменная CFLAGS) -с’.

компиляция программ на C++
Н.o сделано автоматически с n.cc, n.cpp или N.С с рецепт форма
'$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c’.
Мы рекомендуем вам использовать суффикс'. cc ‘для исходных файлов C++ вместо'.С.’

src:https://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules

Comments

    Ничего не найдено.