2012-03-16 145 views
0

我想寫一個Makefile文件有位於不同目錄的源文件的程序,其結構是:Makefile中有多個目錄

--root(here will be makefile)  
    --src: 
    --main.c 
    --include: 
     --here are 6 .h files, that are used by other .c files, main.c includes on all of them 
    --operacje 
     --suma.c 
     --iloczyn.c 
     --roznica.c 
    --reszta: 
     macierz.c 
    --we_wy: 
     --rest of the .c files 

大部分.c文件包括至少一個.h文件中。這是我寫到目前爲止:

VPATH=./src:./src/include:./src/operacje:./src/reszta:./src/we_wy 
CLFAGS = -Wall 
CC = gcc 
INCLUDE = -I src/include 
NAME = macierze 

FILE_SOURCE := pliki.c wczytaj_plik.c wypisz_plik.c 
CONSOLE_SOURCE := wczytaj_konsola.c wypisz_konsola.c 
OTHER_SOURCE := suma.c roznica.c iloczyn.c macierz.c 
HEADERS := suma.h roznica.h iloczyn.h wypisz.h wczytaj.h macierz.h 

FILE_OBJECTS := $(FILE_SOURCE:.c=.o) 
CONSOLE_OBJECTS := $(CONSOLE_SOURCE:.c=.o) 
OTHER_OBJECTS := $(OTHER_SOURCE:.c=.h) 

%.o: %.c %.h 
    gcc $(CFLAGS) $(INCLUDE) -c $? 

%.o: %.c 
    gcc $(CFLAGS) $(INCLUDE) -c $? -o [email protected] 


finput: HEADERS+=pliki.h 

finput: $(FILE_OBJECTS) $(OTHER_OBJECTS) main.o 
    gcc $(CFLAGS) -o $(NAME) $^ -D WEWY_PLIKI 

main.o: main.c $(HEADERS) 
    gcc $(CFLAGS) $(INCLUDE) -c src/main.c 

clean: 
    rm -rf *.o 

的目標是,使編譯的程序運行的有點不同基於化妝,因此-D選項並添加

finput: HEADERS+=pliki.h 

這finput是第一在4種可能的選擇中。每個選項將使用略有不同的.c和.h文件

現在,當我做

make finput 

我得到的清單:

gcc -I src/include -c ./src/we_wy/pliki.c ./src/include/pliki.h 
gcc -I src/include -c ./src/we_wy/wczytaj_plik.c -o wczytaj_plik.o 
gcc -I src/include -c ./src/we_wy/wypisz_plik.c -o wypisz_plik.o 
gcc -I src/include -c src/main.c 
gcc -o macierze pliki.o wczytaj_plik.o wypisz_plik.o ./src/include/suma.h ./src/include/roznica.h ./src/include/iloczyn.h ./src/include/macierz.h main.o -D WEWY_PLIKI 
wczytaj_plik.o: In function `wczytaj': 
wczytaj_plik.c:(.text+0x5f): undefined reference to `macierz_alokuj' 
main.o: In function `main': 
main.c:(.text+0x7e): undefined reference to `suma' 
<and other undefined references in main> 

我注意到幾個錯誤: 1它不會產生來自$(OTHER_OBJECTS)的.o文件 2.從$(CFLAGS) 沒有-Wall選項3.當然它沒有完成。

我會感激一些信息,我做錯了什麼。

回答

1

OTHER_OBJECTS:= $(OTHER_SOURCE:.C = .H)

如果這不是一個錯字,它是(1)的說明。您將文件重命名爲頭文件,頭文件在VPATH中找到,並且沒有重製規則,因此它們逐字包含在$ ^中。嘗試$(OTHER_SOURCE:.c=.o)

CLFAGS = -Wall

CFLAGS嘗試代替。

+0

現在我覺得很傻,一切正常,只有2個錯別字......無論如何,非常感謝您的幫助。 – Andna 2012-03-16 08:55:04

+0

我還有一個問題,我修正了make-file,但是每次我調用finfin它總是至少做.o文件的鏈接(finput規則),即使我沒有對文件做任何修改,爲什麼? – Andna 2012-03-16 09:39:57

+0

沒有'finput'文件,只有'macierze'文件。目標部分說'finput',但是,所以make查找'finput'並且沒有找到它。用'$(NAME)'替換'finput'處處。 – thiton 2012-03-16 09:43:14

1

只是要指出的是這樣的:

finput: HEADERS+=pliki.h 
    ... 
main.o: main.c $(HEADERS) 

你不希望它做的事。特定於目標的變量僅在子對象的配方內生效。它們對先決條件列表沒有任何影響(例如)。

我建議您查看一下自動生成make依賴關係的方法:這比嘗試在makefile中手工維護它們要高效得多(而且準確)。