2013-04-07 109 views
4

我正在用C編程語言編寫UDP客戶端服務器應用程序;我想在依賴關係發生變化時自動編譯2個源文件和3個頭文件,因此我決定使用make實用程序。使用makefile編譯頭文件依賴關係

生成文件的目標被稱爲「編輯」

edit : server_UDP.o client_UDP.o \ 
      gcc -o edit server_UDP.o client_UDP.o \ 


    client_UDP.o : client_UDP.c cliHeader_UDP.h wrapHeader.h 
      gcc -c client_UDP.c 

    server_UDP.o : server_UDP.c servHeader_UDP.h wrapHeader.h 
      gcc -c server_UDP.c 

當我改變的代碼wrapHeader.h幾行它不會引發重新編譯。

當wrapHeader.h中有更改以重新編譯server_UDP和client_UDP時,如何修改編輯makefile規則?

**注意:wrapHeader.h是主頭部

cliHeader_UDP.h:包括 「wrapHeader.h」

servHeader_UDP.h:包括 「wrapHeader.h」

+1

'gcc'和Gnu'make'都有一個*奇妙的功能集,當它們相互協調工作時,它們將完全按照您的需求進行操作。 'gcc -MM'編譯器開關將*幾乎*爲你生成一個'make'兼容的目標。有關如何完成此操作的信息以及一些示例代碼,請參閱gnu make [在此網站]的在線文檔(http://www.gnu.org/software/make/manual/html_node/index.html ),並特別關注[本節](http://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html#Automatic-Prerequisites)。 – WhozCraig 2013-04-07 01:28:55

+0

[Makefile,header dependencies]可能的重複(http://stackoverflow.com/questions/2394609/makefile-header-dependencies) – 2016-12-20 00:02:18

回答

2

我想你想要的是製作依賴文件。

您可以指定編譯器使用'-MMD -MP'參數爲您生成一個依賴項文件,它將創建一個與源文件具有相同名稱的新文件,擴展名* .d除外文件夾作爲您的來源。

依賴項文件包含代碼依賴的所有頭文件,如果修改了頭文件,它將導致GNU編譯源文件。

啓用的例子依賴Makefile文件:

# Makefile 

CC := gcc 
LD := g++ 

# The output executable. 
BIN := program 

# Toolchain arguments. 
CFLAGS := 
CXXFLAGS := $(CFLAGS) 
LDFLAGS := 

# Project sources. 
C_SOURCE_FILES := mysourcefile1.c src/myothersrc.c 
C_OBJECT_FILES := $(patsubst %.c,%.o,$(C_SOURCE_FILES)) 

# The dependency file names. 
DEPS := $(C_OBJECT_FILES:.o=.d) 

all: $(BIN) 

clean: 
    $(RM) $(C_OBJECT_FILES) $(DEPS) $(BIN) 

rebuild: clean all 

$(BIN): $(C_OBJECT_FILES) 
    $(LD) $(C_OBJECT_FILES) $(LDFLAGS) -o [email protected] 

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

# Let make read the dependency files and handle them. 
-include $(DEPS) 

這應該爲你的情況下工作:

SOURCES := server_UDP.c client_UDP.c 
OBJECTS := $(patsubst %.c,%.o,$(SOURCES)) 

DEPS := $(OBJECTS:.o=.d) 

edit: $(OBJECTS) 
    gcc -o edit $(OBJECTS) 

%.o: %.c 
    gcc -c $< -o [email protected] 

-include $(DEPS) 
+0

mmmm我瀏覽了有用的鏈接,但我沒有清楚地理解它,因爲iam新增了makefile實用程序 Dylan McKay也許在我的編輯文件上的一個例子如何把代碼瞭解更多,因爲我困惑... – zak 2013-04-07 01:53:02

+0

看看更新的答案 – Dylan 2013-04-07 01:58:14

+0

的底部,但我想了解更多關於makefile,什麼是patsubst和什麼是OBJECTS:= $(patsubst%.c,%。o,$(SOURCES)) DEPS:= $(OBJECTS:.o = .d) – zak 2013-04-07 02:00:11

0

你不說,edit.c包括你的兩個特定的頭文件,但我想它必須,如果它鏈接到對象。

這正是makepp發揮出其優勢之一的情況:如果按照慣例,每.o文件,你需要鏈接有一個包括相應的名稱的陳述(在你的情況,這將是client_UDP.h & server_UDP.h),那麼除了將頭文件檢測爲依賴關係之外,makepp會將所有內容都映射出來。

這甚至可以遞歸地工作,所以如果你有一個wrapHeader.cedit.c沒有相應的include語句),那麼它會自動編譯和鏈接。

所以你不需要makefile文件。但是,如果你想避免調用makepp edit每次,那麼你可以創建一個班輪

edit: 

您只需要學習語法做,如果你有更復雜的要求。但是,如果你這樣做,沒有限制。除了幾乎所有的GNU make功能之外,還有更多有用的東西,甚至可以用一些Perl編程擴展makefile。

+0

沒有編輯是makefile命令的文件,client_UDP和server_udp不是頭文件.....其源代碼 – zak 2013-04-07 11:18:14

+0

對不起,我不明白你在說什麼。如果你想去我們的[sourceforge論壇](http://sourceforge.net/p/makepp/discussion/),我們可以討論更多。在那裏你可以用世界語,德語或法語寫作,如果你對其中的一種更舒服的話。 – Daniel 2013-04-10 21:04:34