0

讓我們說,我有幾個文件夾庫項目:C庫,生成文件頭的依賴

  • 編譯:其中.o文件去
  • lib目錄下:在編譯的靜態和動態庫去
  • SRC:凡.C源文件去
  • 包括:在頭文件放置

的問題是,每次我更改頭FIL e和make並沒有察覺到這一點(這很明顯,爲什麼如果你看看我的Makefile)並且說一切都是最新的。我已經設法用另一個不是圖書館的項目來解決這個問題,但是每次我嘗試一些東西時,最終都會遇到目標正在建造時的錯誤。這裏是Makefile中:

CC=gcc 
CFLAGS=-g -O2 -Wall -Iinclude -rdynamic -DNDEBUG $(OPTFLAGS) 
LDFLAGS=$(OPTLIBS) 

SOURCES=$(wildcard src/*.c) 
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES)) 

TARGET=lib/libdatastruct.a 
SO_TARGET=$(patsubst %.a,%.so,$(TARGET)) 

# The Target lib 
all: $(TARGET) $(SO_TARGET) 

dev: CFLAGS=-g -Wall -Iinclude -Wall -Wextra $(OPTFLAGS) 
dev: all 

$(TARGET): CFLAGS += -fPIC 
$(TARGET): build $(OBJECTS) 
    ar rcs [email protected] $(OBJECTS) 
    ranlib [email protected] 
$(SO_TARGET): $(TARGET) $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 

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

build: 
    @mkdir -p lib 
    @mkdir -p build 

clean: 
    rm -rf lib build 

回答

0

生成標題列表:

HEADERS := $(wildcard src/*.h) 

因爲你沒有任何相關文件,只需確保所有目標文件依賴於所有的頭文件:

$(OBJECTS): $(HEADERS) 

如果任何頭文件被修改,則每個目標文件都將被重建,因爲任何源文件都可能包含(並取決於)任何頭文件。

如果您不想在更改標題後重建所有內容,則可以手動添加特定的依賴項,以便只重建所需的文件。例如:

src/file.c: src/file.h 
src/main.c: src/main.h src/file.h 

這些依賴關係也可以自動生成。

+0

這是唯一的辦法?因爲它有一個只包含一個文件的修改頭文件,所以整個項目都需要重建。 –

+0

@cpassos沒有任何額外的假設,是的。任何源文件都可以包含任何頭文件,並且沒有關於這些包含的信息可用。 – 2501

+0

@cpassos如果你不想重建所有東西,你可以手動或者編程方式創建特定的依賴關係。 – 2501

1

我能夠自己解決這個問題。改變了這個:

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

要這樣:

build/%.o: src/%.c 
    $(CC) $(CFLAGS) -MMD -o [email protected] -c $< 

include $(DEPS) 

$(DEPS): ; 

並補充說:

DEPS=$(patsubst %.o,%.d,$(OBJECTS)) 

後:

OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES)) 
+0

太棒了!有沒有其他類似的帖子解釋如何創建自動依賴關係,幫助你解決這個問題? – 2501

+0

@ 2501這[網站](http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/)幫助。雖然我不明白它爲什麼有效。是否爲每個.o目標創建兩個食譜?因爲我在'build /%。o:src /%。c'中包含了這一行,並且包含的​​$(DEPS)具有相同的形式,但百分比符號被替換爲實際的文件名。這在makefile中是正常的事情嗎? –

+0

我其實是指規則,而不是食譜。如果我爲單個目標創建多個規則並僅在一個目標上放置一個配方,而將其他配置僅留在依賴關係中,則會始終確保目標是最新的依賴關係? –