2015-02-23 68 views
-4

Belows實踐Makefile非常簡單的代碼。
藍框是源代碼,紅框是Makefile。
我不知道哪一個是正確的寫Makefile btn上面的Makefile或者Bottm Makefile的方法。是的,我想知道「頭文件(helpMe.h)的依賴性」。謝謝。 enter image description here哪一個是編寫Makefile的正確方法?

+0

兩者都是錯誤可以加目標文件,因爲你可以寫一個''%的.o: ''規則並使其成爲通用的,而不是爲每個源文件編寫一個規則,當然你希望在頭部改變時重新編譯,所以真正的問題是什麼? – 2015-02-23 12:37:12

+0

什麼?爲什麼.. T_T。目標是創建helpMe.o和HeaderTest.o – user3595632 2015-02-23 12:38:37

+0

現在,但是如果您想要編譯更多的源文件呢? – 2015-02-23 12:39:07

回答

0

你確實需要.h在目標文件規則,因爲在頭文件的改變,你想重新編譯過程的,所以這是一個Makefile是需要照顧的是

CC  = gcc 
LDFLAGS = 
CFLAGS = -Wall -Werror -std=c99 -pedantic 
OBJ  = helpMe.o 

executable-name: $(OBJ) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o [email protected] 

%.o: %.c %.h 
    $(CC) -c $(CFLAGS) $< 

clean: 
    @rm -fv *.o executable-name 

和你如你所願只需添加文件到$(OBJ)變量的名稱,這樣

CC  = gcc 
LDFLAGS = 
CFLAGS = -Wall -Werror -std=c99 -pedantic 
OBJ  = helpMe.o HeaderTest.o 

executable-name: $(OBJ) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o [email protected] 

%.o: %.c %.h 
    $(CC) -c $(CFLAGS) $< 

clean: 
    @rm -fv *.o executable-name 
+0

這是行不通的,因爲'helpMe.o'實際上並不依賴於'helpMe.h','HeaderTest.o'也不依賴於'HeaderTest.h'。只有'HeaderTest.o'依賴於'helpMe.h',而不依賴於'HeaderTest.h',因爲它不存在。 – 2015-02-23 21:13:30

+0

@RossRidge你所說的一切並不重要,如果你觸摸HeaderTest.h'然後運行'make',那麼目標將被更新,因爲該文件已被創建,所以它是一個依賴項,如果它被忽略不存在,那麼你怎麼看?此外,它不是一對一的依賴性事物,如果任何文件發生變化,整個事情都會得到更新。 – 2015-02-23 23:32:42

+0

'HeaderTest.h'不存在,'touch HeaderTest.h'會不必要地將它創建爲一個空文件。你的makefile確實在每個'.o'文件和'.c'和'.h'文件之間建立了一個一對一的依賴關係。這是你的錯誤。如果'helpMe.h'發生變化,那麼makefile將不會根據需要重新生成'HeaderTest.o'。相反,即使'helpMe.c'實際上不包含'helpMe.h',它也會不必要地重建'helpMe.o'。你似乎不明白你的makefile實際上做了什麼,也不明白原始海報的問題。 – 2015-02-23 23:49:48

相關問題