Make "filename"을 실행할 때 gcc의 기본 매개변수를 어떻게 변경합니까?

Make "filename"을 실행할 때 gcc의 기본 매개변수를 어떻게 변경합니까?

제가 이것을 잘못된 스택에 게시했다면 용서해 주십시오. Makefile이 없는 디렉토리의 파일에 대해 make를 실행할 때마다 make는 여전히 작동하고 소스 코드를 컴파일하지만 인수만 사용하면 됩니다.gcc filename.c -o filename

예를 들어, make test디렉토리에 test.c를 입력하면 다음과 같이 됩니다.gcc test.c -o test

Makefile 없이 make를 실행할 때마다 다음을 수행하도록 이것을 변경하고 싶습니다.gcc -ggdb -std=c99 -Wall -Werror -o filename filename.c -lcs50 -lm

또한 이 변경 사항은 영구적이며 재부팅하거나 디렉터리를 변경해도 변경되지 않을 것이라고 생각했습니다.

저는 현재 AMD 64비트 프로세서에서 Crunchbang Weezy를 실행하고 있습니다.

답변1

CFLAGS환경 변수가 필요합니다 .

예를 들어:

$ export CFLAGS='-ggdb3'
$ make test
cc -ggdb3    test.c   -o test

답변2

일반적으로 입력할 때 make test명령이 누락되면 Makefile도구 make는 일반 컴파일 명령을 사용하려고 시도합니다.

다음과 같은 내용이 있다고 가정해 보겠습니다 test.c.

$ cat test.c 
#include <stdio.h>
int main()
{
    printf( "I am alive!  Beware.\n" );
    return 0;
}

그렇지 않은 경우 Makefile실행하면 make test다음과 같은 동작이 발생합니다.

$ make test
cc     test.c   -o test

노트:후속 실행 결과는 다음과 같습니다.

$ make test
make: `test' is up to date.

테스트 실행:

$ ./test 
I am alive!  Beware.

make test를 입력하고 있다면 자리가 있어야 합니다 Makefile. 내가 가지고 있지 않은 디렉터리에서 명령을 실행하면 Makefile다음과 같은 결과가 나타납니다.

$ make test
make: *** No rule to make target `test'.  Stop.

CFLAGS 사용

make기본 명령줄 옵션을 재정의하려면 다음을 수행할 수 있습니다.

$ export CFLAGS="-ggdb -std=c99 -Wall -Werror -lcs50 -lm"

이제 다음을 실행하면 make:

$ make test
cc -ggdb -std=c99 -Wall -Werror -lcs50 -lm    test.c   -o test

인용하다

답변3

[편집하다]

GNU make 매뉴얼 페이지에서:

-f 옵션이 없으면 make는 makefile GNUmakefile, makefile, Makefile을 순서대로 찾습니다.

CFLAGS매개변수는 Makefile에 변수를 정의한 경우에만 전달될 수 있습니다.

CC=gcc
CFLAGS=-g -O -Wall -Werror

all: foo

foo: foo.o
    $(CC) $(CFLAGS) $<

여기에서 다음을 사용하여 변수를 재정의할 수 있습니다.

$ make CFLAGS="-ggdb -std=c99 -Wall -Werror"
gcc -ggdb -std=c99 -Wall -Werror   -c -o foo.o foo.c
gcc -ggdb -std=c99 -Wall -Werror foo.o

그러나 Makefile을 편집하는 것이 더 쉽습니다.

답변4

make(1)이는 귀하가 가지고 있는 정확한 정보와 사용하는 makefile 에 따라 다릅니다 .

예를 들어, GNU make는 유용한 기본 규칙 및 매크로 세트를 가정합니다. 즉, 매크로 CC는 C 컴파일러의 이름을 제공하고 CXX는 C++ 컴파일러의 이름을 제공하며 CFLAGS는 CC의 플래그이고 CXXFLAGS는 CXX의 플래그입니다.

foo.o또한 do를 호출하여 생성되고 실행 파일을 생성하는 일련의 기본 규칙을 정의합니다 . 마찬가지로, make의 다른 버전에서는 다른 기본 매크로와 규칙을 정의할 수 있습니다(그러나 CC와 CFLAGS는 보편적인 것으로 보입니다).foo.c$(CC) $(CFLAGS) -c foo.cfoofoo.o$(CC) $(CFLAGS) -o foo foo.o

만약 있다면아니요tstmakefile, GNU make 위의 규칙을 사용하면 다음을 통해 매크로를 재정의할 수 있습니다 tst.c.

make CC=clang CFLAGS='-O2 -g -Wall' tst

갑자기 다른 make가 어떻게 반응하는지 모르겠고, 다른 make는 makefile 없이 오류가 발생했던 것으로 기억하는 것 같습니다.

makefile(여러 가지 다른 이름을 가질 수 있음)이 있는 경우 설명서를 확인하십시오. 최소한 makefile해당 makefile Makefile이 정의하는 매크로 정의 및 규칙이 적용됩니다.최대makefile이 존재하지 않으므로 위의 명령을 사용하시면 됩니다. 그러나 보장은 없습니다. 일반적으로 INSTALL, README 또는 일부 변형이라는 이름의 파일이나 makefile 자체에서 지침을 확인하세요.

마지막으로 사용 가능한 몇 가지 대안이 있지만(기본 제어 파일을 주로 부르는 변형 makefile) make(1)거의 보편적이므로 해당 사용에 대해 어딘가에 문서화해야 합니다.

관련 정보