developer tip

CFLAGS, CCFLAGS, CXXFLAGS-이 변수가 정확히 무엇을 제어합니까?

optionbox 2020. 11. 21. 14:13
반응형

CFLAGS, CCFLAGS, CXXFLAGS-이 변수가 정확히 무엇을 제어합니까?


GNU make를 사용하여 C ++ 코드를 컴파일하고 있으며 컴파일을 사용자 정의 할 수있게 만드는 방법을 알고 싶습니다.

그 다른 장소에서 읽기 CFLAGS, CCFLAGS그리고 CXXFLAGS이 목적을 위해 사용됩니다. 그렇다면 어떻게 사용해야합니까? 컴파일러에 추가 명령 줄 인수가있는 경우 인수를 추가 CFLAGS하거나 앞에 추가해야합니까? 일반적인 관행이 있습니까?

왜 세 가지 다른 변수입니까? 나는 C 컴파일러가 받아야 가정 CFLAGSCCFLAGSC ++ 컴파일러가 가야하는 동안, 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. CFLAGSC 컴파일러, CXXFLAGSC ++ 및 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 make main_c and main_cpp from main_c.c and main_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.

참고URL : https://stackoverflow.com/questions/5541946/cflags-ccflags-cxxflags-what-exactly-do-these-variables-control

반응형