2011-03-25 3 views
1
all: run 

run: test.o list.o matrix.o smatrix.o 
    gcc test.o list.o matrix.o smatrix.o -o matrix-mul 

list.o: list.c list.h 
    gcc -g -c list.c 

matrix.o: matrix.c matrix.h 
    gcc -g -std=c99 -c -o matrix.o matrix.c 

smatrix.o: smatrix.c smatrix.h 
    gcc -g -c -o smatrix.o smatrix.c 

test.o: test.c test.h 
    gcc -g -c test.c 

메이크 파일을 만드는 데 많은 문제가 있었으며 마침내이 작업을 수행했습니다. 그리고 단지 이것들이 ok인지 확인하고 싶습니다. (단지 프로그램을 실행하기위한 것이 아니라 좋은 make 파일을 만드는데 유용합니다)파일 만들기,이 모양이 괜찮은가요?

하나의 질문은 matrix.o와 smatrix.o가 .o 파일 gcc -g -c ... list.o와 test.o는 그 줄을 가지고 있지 않습니다 ..

루프 오류가 발생했기 때문에 -std = c99를 추가해야했지만 여전히 ' 왜 행렬에 matrix.o를 넣어야하는지 이해하지 못합니다.

+0

내가 말했지 : http://stackoverflow.com/questions/5432486/make-file-error/5432546#5432546 출력 이름을 지정하지 않아도된다. (처음에는 거기에 넣었던 것이 내 잘못이었다.). 그리고 루프가 이상하지는 않습니다. c90 표준은 for 루프 헤더와 같이 모든 곳에서 로컬 변수를 작성할 수 있도록 지원하지 않으므로 c99 표준으로 전환해야합니다. –

+0

네, 나는 당신의 교정을보기 전에 이것을 썼습니다! 감사! – codereviewanskquestions

답변

5

파일은 정상입니다. 유지 보수가 쉽지 않습니다. http://mrbook.org/blog/tutorials/make/

특히 마지막 예를 살펴 :

CC=g++ 
CFLAGS=-c -Wall 
LDFLAGS= 
SOURCES=main.cpp hello.cpp factorial.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=hello 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

이 어떻게 향상하는 유지 보수를 표시해야합니다 (파일을 추가

이 웹 사이트는 좋은 메이크 파일을 만드는 방법에 대한 정말 좋은 튜토리얼을 가지고 SOURCES에 나머지는 자동으로 수행됩니다.

+0

'-Wall'은 ** 고도로 추천 **, btw입니다. –

1

아래 파일은 make allmake depend 및을 지원합니다- 첫 번째 줄만 바꾸면됩니다. 모든 파일의 포함 항목을 변경하면 make depend을 기억하십시오.

TARGET:=matrix-mul 
SOURCES:=test.c list.c matrix.c smatrix.c 
OBJECTS:=$(SOURCES:%.c=%.o) 
CC=gcc 
CFLAGS=-g -std=c99 -Wall 
LD=gcc 
LDFLAGS= 


# First target - simply say that we want to produce matrix-mul 
all: $(TARGET) 

# To create the target we need all .o files, and we link with LD/LDFLAGS 
# [email protected] is the file we're making, aka matrix-mul 
$(TARGET): $(OBJECTS) 
    $(LD) -o [email protected] $(OBJECTS) $(LDFLAGS) 

#Creating a .o from a .c 
# $< is the c file, [email protected] is the corresponding .o file 
.c.o: 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

# Regenerate dependencies 
depend: 
    $(CC) $(CFLAGS) -MM $(SOURCES) > .depend 

# Remove produced files 
clean: 
    rm -rf $(OBJECTS) $(TARGET) .depend 

# If there's no dependency file, create it 
.depend: depend 

# Include the autogenerated dependency file 
include .depend 

편집 :로 = 행 : 당신이 훨씬 더 일반적인, 당신은 소스를 대체 할 수 원하는 경우

SOURCES:=$(wildcard *.c) 

단순히 현재 디렉토리에있는 모든 .c 인 파일에서 TARGET을 구축 할 예정이 메이크 . 내가보기 엔 여기 제안

0

한가지과 같이, 모든 중간 파일을 삭제하는 clean 대상 (아마 모든 .o 파일)을 추가하는 것입니다 :

추가 신용 들어
clean: 
    rm *.o 

넣어 모든 *.o 파일을 make 변수에 저장하고 해당 변수를 실행 규칙의 대상으로 사용하고 위의 rm 명령 다음에 사용하십시오.

내가 이것을하기 원하는 이유는 디버깅을위한 것입니다. 일 수 있습니다. 위의 규칙 중 하나가 잘못되었지만 이미 모든 .o 파일을 한 번 빌드 했으므로 매번 이전 파일을 픽업하는 것입니다. 빌드하기 전에 make clean을 수행하면이를 포착합니다.