簡體   English   中英

Makefile有多個目錄

[英]Makefile with multiple directories

我想為一個程序編寫一個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 $@


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

目標是,使編譯的程序基於make運行有點不同,因此-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)3沒有-Wall選項。當然它不會完成。

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

OTHER_OBJECTS:= $(OTHER_SOURCE:.c = .h)

如果這不是拼寫錯誤,則是(1.)的解釋。 您將文件重命名為頭文件,並且頭文件在VPATH中找到並且沒有重制規則,因此它們在$ ^中逐字包含。 嘗試$(OTHER_SOURCE:.c=.o)

CLFAGS = -Wall

請嘗試使用CFLAGS

只是要指出這一點:

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

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

我建議您研究自動生成make依賴項的方法:這比嘗試在makefile中手動維護它們更有效(也更准確)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM