2011-03-25 109 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 

我在製作makefile時遇到了很多問題,終於得到了這個工作。我只是想確保這些都沒問題(不僅僅是爲了讓程序運行,而且是在一個良好的make文件中)make file,這看起來好嗎?

一個問題是,爲什麼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你不需要specyfying輸出名稱(這是我的錯,我把它放在那裏)。循環的東西並不奇怪,c90標準不支持在任何地方創建局部變量,比如在for循環頭文件中,所以你切換到了c99標準。 – 2011-03-25 13:48:01

+0

是的,我在看到你的改正之前寫了這個!謝謝! – codereviewanskquestions 2011-03-25 20:14:13

回答

5

該文件是OK-ISH。這不是很容易維護。

這個網站有關於如何使漂亮的makefile一個很好的教程: 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' ** **推薦,順便說一句。 – 2011-03-25 13:28:35

1

以下文件支持make allmake dependmake clean - 您只需要更改第一行。如果您在任何文件中更改包含,請記住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 

編輯:如果你想要這個更加通用的,可以更換SOURCE:用=行:

SOURCES:=$(wildcard *.c) 

這個Makefile會再簡單地從所有的.c文件在當前目錄下創建目標。

0

有一件事我會強烈建議這裏是添加一個clean目標是刪除所有中間文件(可能是所有的.o文件),像這樣:

clean: 
    rm *.o 

對於額外的信用,把你所有的*.o文件放在一個make變量中,並將該變量用作運行規則的目標,並在上面的命令後執行。

我希望你這樣做的原因是爲了調試目的。它可能是你有上面的規則之一錯了,但既然你已經建立了所有的.o文件一次,它只是每次都拿起一箇舊的。如果你在構建之前做了make clean,它會抓住它。