2014-03-25 4 views
1

저는 Makefile 비즈니스에서 길을 잃었습니다. 누군가가 내가 현재 프로그래밍하고있는 예를 들어 명확하게 이해할 수 있다면 좋을 것이다.Makefile을 사용하여 여러 파일 연결하기

나는 이러한 파일이 있습니다

my-bit-vector.h -> a header file included in eratost.c, ppm.c 
ppm.c -> a .c file which includes my-bit-vector.h and error.h 
error.h -> a header file included in eratost.c, ppm.c 
error.c -> a .c file which includes error.h and defines the functions in it 
erato.c -> a .c file which includes my-bit-vector.h and error.h 

내가 하나 개의 실행 파일로 함께 이들을 연결해야합니다. 어떻게하면 Makefile을 통해 그렇게 할 수 있을까요? 나는 내가 뭔가를 잊지 않았 으면 좋겠다. 도와 주실 수 있겠습니까?

+0

어느 것이'main' 함수를 포함합니까? 그리고이 모든 파일들이 하나의 디렉토리에 함께 있습니까? – patrickvacek

+0

@patrickvacek 왜'main() '을 포함하는 소스가 중요한가요? – mah

+0

main()은 ppm.c에 있으며 파일은 함께 있습니다. – imre

답변

3

Makefile의 내용은 단순하게 입력하면 하나 이상의 대상 (빌드하려는 것)입니다. 각 대상에는 종속성이 있습니다 (종속성이 아직없는 경우 빌드해야하며 대상은 존재하지만 대상보다 새로운 경우 대상을 다시 작성해야 함) 및 규칙 (대상을 빌드하는 명령, 아마도 의존성으로부터).

최종 결과물이 program이라는 프로그램이라고 가정 해 보겠습니다. 빌드 할 소스를 찾았지만 소스에서 직접 실행 파일을 빌드하지 않으면 오브젝트 파일에서 직접 빌드 할 수 있습니다. 이처럼 메이크를 시작할 수 : 규칙 라인에

program: ppm.o error.o erato.o 
     cc -o program ppm.o error.o erato.o 

경고 간격은 (위의 cc 명령 행)는 TAB뿐 아니라 공간이 필요합니다!

시작하기에 충분하지만 옳기에 충분하지 않습니다. .o의 종속성/규칙은 아직 목표가 없다는 것을 알게 될 것입니다. 그러나 Make는 몇 가지 기본 규칙을 가지고 있기 때문에 여전히 작동합니다.

이 makefile을 사용하면 "make"를 두 번 입력하면 처음에는 모든 것이 빌드되고 두 번째로는 변경되지 않습니다. 아무런 변화가 없으므로 다시 빌드 할 필요가 없습니다.

program: ppm.o error.o erato.o 
     cc -o program ppm.o error.o erato.o 

ppm.o: ppm.c my-bit-vector.h error.h 

error.o: error.c error.h 

erato.o: erato.c my-bit-vector.h error.h 

이제 당신이있어 의존성이 헤더를 다시 작성해야 소스를 재 구축 할 수 있도록 원인 설정 : 당신은 지금 당신의 .H 년대를 편집 불행히도 경우가 .c 년대는 여전히 그 문제를 해결 할 수 있습니다, 다시하지 않을 것이다 변화. 이러한 소스 빌드에는 내장 규칙이 (종종) 충분하기 때문에 규칙이 없습니다. 물론 내장 된 것을 덮어 쓸 수 있습니다.

"make"를 입력하면이 도구는 첫 번째 대상 (프로그램)을 찾고 해당 종속성을 검사합니다. 그런 다음 종속성을 빌드 할 필요가있는 대상이있는 한 각각의 종속성이 최신인지 (대상에 따라 달라짐 : 종속성/규칙 정의) 재귀 적으로 확인합니다. 마지막으로 빌드를 완료하기 위해이 대상에 대한 규칙을 적용합니다.

makefiles로 할 수있는 내용이 개 더 있습니다.이 내용은 간단한 소개입니다.

+0

도움 주셔서 감사합니다. – imre

3
program: ppm.o error.o erato.o 
    gcc ppm.o error.o erato.o -o program 
ppm.o: ppm.c 
    gcc -c ppm.c -o ppm.o 
error.o: error.c 
    gcc -c error.c -o error.o 
erato.o: erato.c 
    gcc -c erato.c -o erato.o 

":"이 대상이되기 전에. stuff after : ":"이 대상에 필요한 대상입니다. "make program"이 make 인 경우 "all"이라는 대상을 찾습니다. 목표에는 모두 makefile에서 target으로 정의 된 ppm.o가 필요합니다. 그래서이 타겟을 먼저 실행합니다. 목표 ppm.o에는 makefile에 정의 된 대상이없는 ppm.c가 필요하므로 아마도 파일 일 것입니다. 이 기능이 기본 기능을 설명하기를 바랍니다.

http://mrbook.org/tutorials/make/ 은 기초적인 메이크 파일 예제와 함께 초보자를위한 훌륭한 자습서입니다.

+0

이와 같은 단순한 makefile에서'all' 대신에 초기 타겟'program'의 이름을 바꾸는 것이 낫습니다. 이렇게하면 make가'program'이 이미 존재하고 직접적 또는 간접적 의존성보다 오래되지 않았다고 판단되면 make는 프로그램을 다시 컴파일 할 필요가 없다는 것을 안다. 합리적인 중간 지점은'all : program'을 target/dependency로 추가하여 재 빌드 할 필요가없는 것을 다시 빌드하지 않고 추가 최상위 빌드를 허용하는 것입니다. – mah

+0

가 변경되었습니다. 힌트를 주셔서 감사합니다. –

관련 문제