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? ФАД!)
извините за так много вопросов; вы, очевидно, не ответите на них все, но я надеюсь, что ответы помогут мне понять общую идею этих настроек.
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