IT

CFLAGS 대 CPPFLAGS

lottoking 2020. 9. 1. 07:40
반응형

CFLAGS 대 CPPFLAGS


CFLAGS (또는 C ++의 경우 CXXFLAGS)는 컴파일러 용이고 CPPFLAGS는 전 처리기를 사용하는 것을 이해합니다.

그러나 나는 여전히 그 차이를 이해하지 않는다.

#include에 포함 된 헤더 파일에 대한 포함 경로를 지정해야합니다. #include는 전 처리기 지시문이기 때문에 전 처리기 (CPPFLAGS) 만 제가 신경 쓰는 것입니까?

어떤 상황에서 컴파일러에 추가 포함 경로를 제공해야합니까?

일반적으로 전처리 기가 필요한 헤더 파일을 찾아 포함하는 경우 디렉토리에 대해 알려야하는 이유는 무엇입니까? CFLAGS는 어떤 용도로 사용됩니까?

(제 경우 에는 두 가지 모두 프로그램을 사용할 수있게하여 혼란을 가중 수정 ... CFLAGS 또는 CPPFLAGS를 사용 하여 목표를 달성 할 수 있습니다 (적어도 autoconf에서). 무엇을 제공합니까?)


C 프로그램을 준비하기위한 암시 적 make 규칙은 다음과 적응합니다.

%.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 ++ 컴파일러 에 전달하고 싶지 않을 것입니다 !

그런 다음 makefile에서 이와 같은 결과를 얻을 수 있습니다.

CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++

CPPFLAGS매크로를 지정하는 데 사용할 수있는 하나의 디렉토리 입니다 #include.

모두 CPPFLAGSCFLAGS귀하의 경우 작업 때문에 make(1) 규칙은 전처리 및 (모두 매크로 명령에 사용) 하나의 명령으로 선택을 결합합니다.

.양식을 사용하는 경우 include-directory 로 필요가 없습니다 #include "...". 또한 표준 컴파일러 포함를 필요가 없습니다. 다른 모든 include- 디렉토리를 지정해야합니다.


당신은 암시 적을 규칙을 따르고 있습니다.

참고 URL : https://stackoverflow.com/questions/2754966/cflags-vs-cppflags

반응형