2014-10-30 2 views
0

나는 현재 나는이에 대한 몇 가지 질문이 있지만 작동 다음 메이크 (I 온라인 자습서의 예를 사용하고) 있습니다이해 메이크 더 나은 - .o 만 파일이 경우에 생성됩니다 어떻게

# ***************************************************** 
# Variables to control Makefile operation 

CXX = g++ 
CXXFLAGS = -Wall -g 


test: main.o car.o student.o house.o 
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o 
    objcopy --only-keep-debug test test.debug 

main.o: student.h house.h main.cpp 
    $(CXX) $(CXXFLAGS) -c main.cpp 

car.o: car.h 

student.o: student.h car.h 

house.o: house.h 

clean: 
    rm -rf *.o test *.debug 

여기에 무슨 일이 벌어지고 있는지에 대한 이해는 내가 틀렸다면 나를 교정 해주시기 바랍니다. 처음에는 테스트 대상이 호출되면 첫 번째 종속성을 찾습니다. main.o이 파일 또는 대상이 될 수 있습니다. main.o이라는 파일이 없으므로 main.o을 대상으로 검색합니다. main.o가 타겟으로되면, 종속성은 student.h house.h main.cpp입니다. 이것들은 파일 make로서 존재하기 때문에, $(CXX) $(CXXFLAGS) -c main.cpp 인 레시피 (커멘드)를 실행하기 때문에 의존성을 찾습니다. 이제 내가 이해하지 못하는 부분이있다. 두 번째 종속성 car.o이 나오면 make는 car.h를 찾고 찾는다. 그러나 .o 파일을 생성하라는 명령은 없다. 여기서 .o 파일을 생성하는 방법은 무엇입니까?

+0

'make -p'를 실행하여 기본 규칙을 찾습니다. 'make --trace'를 규칙 화하거나 [remake] (http://bashdb.sourceforge.net/remake/)를'remake -x'로 사용하여 무슨 일이 일어나고 있는지 이해하십시오. –

+0

사소한 언급 : 위의 _it은 파일 또는 target_ 일 수 있습니다. 그것이 어떻게 작동하는지는 아닙니다 : 그것은 모든 전제 조건을 목표로 고려합니다. make가 대상을 업데이트하기위한 적용 가능한 규칙을 찾을 수없고 대상 파일이 존재하면 make는 대상을 "빌드 된"것으로 간주하고 계속 진행합니다. 이것이 car.h와 같은 파일을 처리하는 방법입니다. – MadScientist

답변

1

.cpp 파일에서 .o 파일을 생성하기위한 기본 규칙이 있습니다.

car.h에 추가 종속성이 있지만 car.o를 기본 규칙에 되돌려 놓고 car.h를 추가 종속성으로 사용하지 않는 방법을 설명했습니다.

당신은

main.o: student.h house.h main.cpp 
    $(CXX) $(CXXFLAGS) -c main.cpp 

main.o: student.h house.h 

을 변경할 수 있으며, 그것은 너무 규칙에 내장하여 구축 할 것입니다. 그것의 문서화 된 here.

objcopy 명령도 실행하지 않았 으면 테스트 바이너리를 만들기 위해 내장 규칙을 사용할 수도 있습니다. 대신

test: main.o car.o student.o house.o 
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o 

당신은 그냥 임의의 수의 소스 파일을 (변환 등의 작업에 대한 묵시적 규칙을 미리 정의

test: main.o car.o student.o house.o 
+0

매우 오래된 버전의 make 매뉴얼에 링크 된 이유가 있습니까? –

+0

그래서'$ (CXX) $ (CXXFLAGS) -c main.cpp '명령을 추가하지 않고'main.o : student.h house.h'에 의존성'student.h'와'house.h' 만 사용한다면 '그러면 make는 단순히 명령을 추가합니다 (누락 된 경우). – MistyD

+0

@EtanReisner 감사합니다. –

2

make에는 몇 가지 암시 적 규칙이 있습니다. 즉, make는 .cpp 파일에서 .o 파일을 만드는 방법을 명시 적으로 말하지 않고 .o 파일을 만드는 방법에 대한 기본 지식을 갖추고 있음을 의미합니다. 문서에서

:

Compiling C++ programs

n.o is made automatically from n.cc, n.cpp, or n.C with a recipe of the form ‘$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c’. We encourage you to use the suffix ‘.cc’ for C++ source files instead of ‘.C’

당신이 만드는 아주 좋아 보이는 내장 규칙을 가진 것으로 생각할 수 있습니다

%.o : %.cpp 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o [email protected] 

이 묵시적 규칙 herehere에 대한 자세한 내용을.

1

대부분의 make (유사한) 프로그램을 사용할 수 있습니다 공통 확장자)를 오브젝트 파일에 추가합니다 (기본 확장자 사용).

일반적으로 그 같은 것을 동등 수 있습니다 :

.c.o: 
    $(CC) $(CFLAGS) -o $*.o -c $*.c 

.cc.o: 
    $(CXX) $(CXXFLAGS) -o $*.o -c $*.cc 

...다른 일반적인 확장 기능을 더 많이 사용하기 때문에 .o 파일에 가장 일반적인 확장자 (.c, .cc, .cpp, .C 등)를 컴파일하는 방법을 알 수있을뿐만 아니라 일부 내용 변수는 컴파일러에 전달할 플래그 집합으로 지정할 수 있습니다.

.cc.o:과 같은 규칙은 기본적으로 "이 규칙을 사용하여 .cc 파일을 만들면 .cc 파일을 만들 수 있습니다."라는 암시 적 규칙입니다. 이것들은 일종의 백스톱으로 사용됩니다. 특정의 .o 파일을 만드는 방법을 명시 적으로 말하는 규칙이있는 경우, make는 그것을 우선적으로 사용합니다. 그러나 명시적인 규칙이없는 경우에는 다시 사용할 수 있습니다. 암시적인 규칙 대신.

$*은 내장 매크로로 소스 파일의 기본 이름 (확장자 없음)으로 확장됩니다. 소스의 기본 이름 ($*)과 소스 파일의 전체 이름 ($<)에 대한 숫자가 많이 있습니다. 이와 같은 여러 가지 다른 자동 변수가 있지만 대부분의 사람들이 사용하는 경우가 거의 없기 때문에 사용하지 않아도됩니다.

+0

설명을 주셔서 감사합니다. 그러나'.cc.o :'와'$ *.o '는 큰 설명을 주신 덕분에 – MistyD

+0

을 의미 할 것입니다. 나는 Pauls 대답을해야만했다. 당신의 설명이 확실히 도움이되었습니다. 답변을 확대 해 주셔서 다시 한 번 감사드립니다. – MistyD

관련 문제