[c] “make”명령 줄 인수 (-D)에서 C 소스 코드로 매크로 정의를 전달하는 방법은 무엇입니까?

나는 보통 “make command line”에서 “makefile”옵션을 사용하여 매크로 정의를 전달합니다 : -Dname = value. 정의는 makefile 내에서 액세스 할 수 있습니다.

또한 유사한 컴파일러 옵션을 사용하여 “makefile”의 매크로 정의를 “소스 코드”로 전달합니다. -Dname = value (많은 컴파일러에서 지원됨). 이 정의는 소스 코드에서 액세스 할 수 있습니다.

지금 필요한 것은 makefile의 사용자가 makefile에서 아무것도 변경하지 않고도 “make.exe 명령 줄”에서 “소스 코드”로 임의의 매크로 정의를 즉시 전달할 수 있도록하는 것입니다.

따라서 사용자는 다음을 입력 할 수 있습니다. make -f mymakefile.mk -SOMEOPTION var = 5

그런 다음 코드 main.c에서 var를 볼 수 있습니다.

int main()
{
  int i = var;
}



답변

다음과 같이 make명령을 호출 하십시오.

make CFLAGS=-Dvar=42

그리고 $(CFLAGS)Makefile의 컴파일 명령에서 사용하십시오 . @ jørgensen이 언급했듯이 make명령 뒤에 변수 할당을 넣으면 CFLAGSMakefile에 이미 정의 된 값 이 재정의됩니다 .

또는 -Dvar=42다른 변수에 설정 CFLAGS한 다음이 변수를 다시 사용 CFLAGS하여 완전히 재정의하는 것을 방지 할 수 CFLAGS있습니다.


답변

이를 위해 특정 변수를 사용하십시오.

$ cat Makefile
all:
    echo foo | gcc $(USER_DEFINES) -E -xc -

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc -
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc -
...
bar

$ make
echo foo | gcc  -E -xc -
...
foo


답변

이쪽 으로 전화

make CFLAGS=-Dvar=42

환경뿐만 아니라 Makefile의 CFLAGS를 재정의하기를 원하기 때문입니다 (Makefile 변수와 관련하여 우선 순위가 낮음).


답변

평판이 낮기 때문에 받아 들여진 답변에 대해 언급 할 수 없습니다.

미리 정의 된 변수를 언급하고 싶습니다 CPPFLAGS. GNU Make 매뉴얼에 다음과 같이 설명되어 있으므로 CFLAGS또는 보다 더 잘 맞을 수 있습니다 .CXXFLAGS

C 전 처리기 및이를 사용하는 프로그램 (C 및 Fortran 컴파일러)에 제공 할 추가 플래그.

사용하는 기본 제공 암시 적 규칙의 예 CPPFLAGS

  • n.on.c다음 형식의 레시피 를 사용하여 자동으로 생성됩니다 .
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.on.cc, n.cpp에서 또는 n.C다음 형식의 레시피를 사용하여 자동으로 만들어집니다 .
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

하나는 명령 make CPPFLAGS=-Dvar=123을 사용하여 원하는 매크로를 정의합니다.

더 많은 정보


답변

$ 고양이 x.mak
모두:
    에코 $ (옵션)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
에코 -DPASSTOC = 42
-DPASSTOC = 42


답변

요구 사항을 충족하기 위해 아래에서 C 파일 및 Makefile 구현을 찾으십시오.

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c


답변