이 Makefile은 컴파일러를 지정하지 않고도 C 프로그램을 어떻게 만들 수 있습니까?


41

" Advanced Linux Programming (2001)" [code] 책에서 Makefile을 사용하고있었습니다 . GNU make 가 Makefile에 컴파일러를 지정하지 않고도 코드를 올바르게 컴파일 한다는 것을 알게 된 것은 이상했습니다 . 레시피없이 굽는 것과 같습니다!

이것은 코드의 최소 버전입니다.

test.c

int main(){}

메이크 파일

all:            test

정말 작동합니다! 이것이 실행하는 명령입니다.

cc     test.c   -o test

설명서에서 유용한 것을 찾을 수 없습니다. 이것이 어떻게 가능합니까?


추신 하나의 추가 참고 사항 : 언어도 지정되지 않았습니다. 때문에 test.c가능하며, GNU는 make사용합니다 cc. 가 존재하지 않는 경우 test.cpp또는 test.cc(더있을 때 test.c), 그것은 사용 g++(하지 c++).


4
"레시피없는 베이킹과 같습니다!" 조리법은 물을 끓일 것을 지시하지만 가스 렌지 위의 팬, 유도 스토브 위의 팬, 전기 주전자 또는 불 위에 삼각대에 놓인 가마솥을 사용하여 물을 끓여야하는지 여부는 아닙니다. 물을 어디에서 가져와야하는지 알려주지도 않습니다. 이것은 make물을 끓여 make
달라고

1
@Rhymoid 마치 소리지르는 것과 같습니다. 케이크를 원합니다! 그런 다음 make냉장고 라는 로봇이 냉장고를 확인하고 밀가루가 있는지 알아 낸 다음 내부 레시피에서 기본 케이크를 굽습니다. :-)
Ho1

@ Ho1 : 로봇이 물어볼 수 있습니다. 어떤 케이크를 원하십니까? :) : D
Sohihi

답변:


68

기본 제공 규칙을 사용하여이 작업을 수행합니다 . 이것들은 특히 C 코드를 컴파일하는 방법과 단일 객체 프로그램을 연결하는 방법을 알려줍니다.

실제로 Makefile이 필요하지 않습니다.

make test

하나없이 작동합니다.

이 모든 것을 가능하게하는 숨겨진 규칙을 보려면 -pMakefile없이 옵션을 사용하십시오 .

make -p -f /dev/null

alephzero가 지적한 것처럼 , Make는 아주 오랫동안 내장 규칙을 가지고있었습니다 (항상 그런 것은 아님). Stuart Feldman의 첫 번째 버전 인 Unix V7 은 이들을 정의files.c 하며 그의 1979 년 논문 은 그것들을 언급합니다. 또한 POSIX 사양의 일부입니다 . (이것이 모든 Make 구현이이를 지원한다는 것을 의미하지는 않습니다. DOS 용 구형 Borland Make는 적어도 3.0 버전까지는 지원하지 않습니다.)


2
나는 그렇게 생각했지만 POSIX도 그들을 지정합니다 !
Stephen Kitt

5
@KingZoingo Make는 사실상 일종의 추론 엔진입니다. 규칙 세트 (내장 및 Makefile), 기존 아티팩트 (현재 디렉토리의 파일 또는 Makefile에 이름이 지정된 파일) 및 요청 된 아티팩트 ( Makefile); 규칙과 기존 아티팩트를 일치시켜 요청 된 아티팩트를 얻는 데 사용할 수 있는지 여부를 판별하려고합니다. 내장 규칙에 따라 test.c생성하는 데 사용할 수 있습니다 test. make -d과정을 자세하게 보여줄 것입니다.
Stephen Kitt

4
@ Ho1 @StephenKitt makeGNU 또는 POSIX가 발명되기 오래 전부터있었습니다. 첫 번째 버전은 거의 40 년 전에 작성되었으며 그 이전에도 쉘 스크립트로 작성된 일부 프로토 타입 버전이있었습니다.
alephzero

3
@jamesqf는 CPP여전히 전처리기를 호출합니다 ( cc -E일반적으로). C ++ 컴파일러는 CXX입니다.
Stephen Kitt

3
CXX이 문맥에서 @ Ho1 은 명령이 아니라 Make 변수 $(CXX)입니다. Makefile에서는 C ++ 컴파일러를 실행하는 명령으로 대체됩니다.
Stephen Kitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.