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
? FUD!)
많은 질문에 대해 죄송합니다. 당신은 분명히 그들 모두에 대답하지 않을 것이지만 대답이 이러한 설정의 일반적인 아이디어를 이해하는 데 도움이되기를 바랍니다.
아시다시피 이들은 컴파일러 옵션이 아닌 Makefile {매크로 또는 변수}입니다. 그들은 일련의 규칙을 구현합니다. (매크로는 그들에 대한 오래된 이름이지만 여전히 일부 사람들이 사용합니다. GNU make doc는 변수를 호출합니다.)
이름이 중요한 유일한 이유는 make -p
일부를 사용 하는를 통해 표시되는 기본 make 규칙 때문입니다 .
모든 고유 한 규칙을 작성하면 모든 고유 한 매크로 이름을 선택하게됩니다.
바닐라 gnu make에는 CCFLAGS와 같은 것이 없습니다. 있다 CFLAGS
, CPPFLAGS
하고 CXXFLAGS
. CFLAGS
C 컴파일러, CXXFLAGS
C ++ 및 CPPFLAGS
둘 다.
왜 CPPFLAGS
둘 다에 있습니까? 일반적으로 전 처리기 플래그 ( -D
, -U
) 의 홈이며 c와 C ++ 모두이 플래그를 사용합니다. 이제 모든 사람 이 C와 C ++에 대해 동일한 정의 환경을 원한다는 가정 은 의심 스럽지만 전통적입니다.
PS James Moore가 언급했듯이 일부 프로젝트는 C 전처리기에 대한 플래그가 아닌 C ++ 컴파일러에 대한 플래그에 CPPFLAGS를 사용합니다. 하나의 큰 예를 들면 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는 PreProcessor (Plus Plus가 아님)를 의미합니다.
CPP : 표준 출력에 대한 결과와 함께 C 전처리기를 실행하기위한 프로그램. 기본값은 '$ (CC) -E'입니다.
이 변수는 암시 적 규칙에 의해 사용됩니다. make
C 프로그램
no는
'$ (CC) $ (CPPFLAGS) $ (CFLAGS) -c' 형식의 레시피로 nc에서 자동으로 컴파일 됩니다 .C ++ 프로그램을 컴파일하는
것은
'$ (CXX) $ (CPPFLAGS) $ (CXXFLAGS) -c' 형식의 레시피를 사용하여 n.cc, n.cpp 또는 nC에서 자동으로 만들어집니다 .
C ++ 소스 파일에는 '.C'대신 '.cc'접미사를 사용하는 것이 좋습니다.
소스 : https://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules
And just to make what Mizux said as a minimal example:
main_c.c
#include <stdio.h>
int main(void) {
puts("hello");
}
main_cpp.cpp
#include <iostream>
int main(void) {
std::cout << "hello" << std::endl;
}
Then, without any Makefile
:
make CFLAGS='-g -O3' CXXFLAGS='-ggdb3 -O0' CPPFLAGS='-DX=1 -DY=2' main_c main_cpp
runs:
cc -g -O3 -DX=1 -DY=2 main_c.c -o main_c
g++ -ggdb3 -O0 -DX=1 -DY=2 main_cpp.cpp -o main_cpp
So we understand that:
make
had implicit rules to makemain_c
andmain_cpp
frommain_c.c
andmain_cpp.cpp
- CFLAGS and CPPFLAGS were used as part of the implicit rule for
.c
compilation - CXXFLAGS and CPPFLAGS were used as part of the implicit rule for
.cpp
compilation
Those variables are only used in make's implicit rules automatically: if compilation had used our own explicit rules, then we would have to explicitly use those variables as in:
main_c: main_c.c
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $<
main_cpp: main_c.c
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
to achieve a similar affect to the implicit rules.
We could also name those variables however we want: but since Make already treats them magically in the implicit rules, those make good name choices.
Tested in Ubuntu 16.04, GNU Make 4.1.
'developer tip' 카테고리의 다른 글
스칼라 식별 기능이 있습니까? (0) | 2020.11.21 |
---|---|
람다 함수를 사용하는 이유는 무엇입니까? (0) | 2020.11.21 |
스콜 렘은 무엇입니까? (0) | 2020.11.21 |
하나의 채널에서 청취하는 여러 고 루틴 (0) | 2020.11.21 |
HTML의 뷰포트 란 무엇입니까? (0) | 2020.11.21 |