2017-05-14 58 views
0

我目前正在嘗試制定一個可用於多個項目的Makefile,而無需爲每個單個項目進行更改。不過,我最近開始用C語言編程,並使MakefilesC Makefile - 用於不同文件結尾的子目錄

這是我目前的項目結構。

project 
| src 
    | gd.c, gd.h, geom.c(only file with main function) 
| obj // *.o files should be created here 
| bin // executable should be created here 
| Makefile 

這是我到目前爲止構建的內容,但不知道如何指定編譯/鏈接文件的子目錄。

1 TARGET = projectname 
2 LIBS = -lm 
3 CC = gcc 
4 CFLAGS = -std=c11 -Wall 
5 LD = gcc 
6 LDFLAGS = -Wall 
7 
8 SRCDIR = src 
9 OBJDIR = obj 
10 EXEDIR = bin 
11 
12 SOURCES = 
13 HEADERS = 
14 OBJECTS = 
15 
16 $(EXEDIR)/$(TARGET): $(OBJECTS) 
17  $(LD) $(OBJECTS) $(LDFLAGS) -o [email protected] $(LIBS) 
18 
19 $(OBJECTS): $(SOURCES) $(HEADERS) 
20  $(CC) $(CFLAGS) -c $< -o [email protected] 
21 
22 .PHONY: clean 
23 clean: 
24  rm -f *.o 
25 
26 .PHONY: remove 
27 remove: clean 
28  rm -f $(EXEDIR)/$(TARGET) 

我的問題是:

  1. 我怎樣才能創建這些文件並把它們在各自的子目錄中有我的佈局或類似於它的東西?
  2. 使用make命令時是否可以創建必要的文件夾(obj和bin)?如果可以,我該怎麼做?
+0

您需要創建一個文件'sources.mk'包含所有'* .c'與相應的路徑。在'Makefile'中包含'sources.mk'文件。對於對象和bin文件,你可以直接在'Makefile'中爲它們指定目錄。 – Gaurav

+0

目前還不清楚你想要什麼。你需要一個makefile來編譯和鏈接它在src /'中找到的所有源代碼嗎?或者可以從一個源文件池中構建幾個不同可執行文件的makefile,爲每個文件選擇正確的源文件? – Beta

回答

1

如果我沒有理解好了,你想知道 - 在佈局 - 如何設置源碼,頭文件和對象的值,這將使你的Makefile工作。

爲此,您可以使用正則表達式:

SOURCES = $(wildcard $(SRCDIR)/*.c) 
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES)) 
HEADERS = $(patsubst %.c,%.h,$(SOURCES)) 

wildcard文檔here

patsubst文檔here

這是一個簡單的答案,如果你想創建一個完全可重複使用的Makefile例如,你將不得不處理源文件子文件夾。

創建對象的規則很奇怪(可能有效)。我認爲這是更好,如果你使用一個規則來同時創建一個源一個對象,是這樣的:

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

在這種情況下,數據來源變量變得無用。

而且頭變量是沒用的,我認爲,是因爲在編譯過程中,你不給gcc的頭,但頭與gcc ... -I<headers folder>

文件夾和清潔應該是rm -f $(OBJDIR)/*.o以刪除目標文件obj文件夾

編輯

我忘了第二個問題,你可以使用shell命令來創建該文件夾是文件創建之前:

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
    @mkdir $(OBJDIR) 
    $(CC) $(CFLAGS) -c $< -o [email protected]