2013-06-03 30 views
1

我創建了一個Makefile文件我的項目,它看起來像這樣:生成文件的FTP服務器 - 編譯時頭文件修改

CC = g++ 
LDFLAGS = -lpthread 
CFLAGS = -Wall -pedantic -Wno-long-long -O0 -ggdb 
SOURCES = main.o List.o ProcessCommands.o HandleTransfers.o 

all: $(SOURCES) 

%.o: %.cpp 
    $(CC) $< -o [email protected] -c $(CFLAGS) $(LDFLAGS) 

compile: 
    $(CC) $(SOURCES) -o executable/ftp $(LDFLAGS) 

run: 
    ./executable/ftp 

clean: 
    rm -rf *o ftp 

doc: 
    doxygen ftpDocConf 

主要的問題是,當我修改任何的頭文件,包含在一個我的源文件中,「make all」命令沒有注意到任何改變,因此返回「make:沒有爲'all'完成」。我搜索了互聯網,仍然無法使其工作。我也有makefile的另一個「問題」。這個makefile所用的項目是一個ftp服務器,當我輸入「make run」來運行可執行文件時,對服務器執行一些操作並退出程序makefile返回「make:* [run] Interrupt」。有沒有什麼辦法可以讓這條消息不出現?我想這似乎是因爲我用ctrl + c退出程序,但有沒有辦法以不同的方式做,所以我不會得到任何「錯誤」?

預先感謝任何答案

回答

1

當你改變你的頭文件的目標文件不重新編譯的原因是,你還沒有宣佈任何頭文件是目標文件的先決條件。你必須明確地做到這一點,否則安排這些信息被自動生成(通常由你的編譯器)。您的模式規則%.o : %.cpp指出如果.cpp文件發生更改,則必須重建關聯的.o文件。您需要添加一些xxx.o : xxx.h ...規則,以便讓頭知道頭文件。或者,如我所說,安排他們自動生成。這裏有很多解決方案,例如:GNU make: Generating automatic dependencies with generated header files

對於第二個問題,沒有辦法做到這一點。當您在終端上按^C時,它不僅向ftp程序發送中斷信號,還向make本身發送中斷信號。沒有辦法說服讓我忽略我意識到的信號。要做到這一點的唯一方法是編寫一個封裝程序來改變進程組ID,以便它不會收到這些信號......但是我不知道ftp程序如何再次加入進程組。

如果這是一個嚴重的問題,我建議您找到一種更具破壞性的方式退出程序。也許你可以使用kill或類似的方法直接發送SIGHUP或SIGTERM到流程。

然後,如果你想使忽略錯誤,您的規則更改爲類似這樣:

run: 
     ./executable/ftp || true 
+0

謝謝,我看到它不是很難解決:)。至於第二個問題,我通過捕獲^ c信號來解決它。 – user2274361

1

MadScientist解釋了頭你的問題很好。我可以添加這些廉價和骯髒的修復:

# header files added as dependencies of .o files below 
%.o: %.cpp header1.h header2.h header3.h 
    $(CC) $< -o [email protected] -c $(CFLAGS) $(LDFLAGS) 

爲了解決您的make run問題,你可以改變你的運行目標在xterm執行 - 這種方式在xterm捕獲信號,而不是讓:

run: 
    xterm -e ./executable/ftp 
+0

感謝您的幫助。它當然有用,但我沒有包含在每個源代碼中的所有標題。有了這段代碼,當我修改一個頭文件時,每個源文件都會被編譯好嗎? – user2274361

+0

是的,正如我所說,快速和骯髒。如果你不想要,你應該使用@ MadScientist的建議添加更細粒度的依賴項......'xxx.o:xxx.cpp xxx.h ...' –