簡體   English   中英

GNU Makefile規則和依賴項

[英]GNU makefile rules and dependencies

我一直在閱讀有關如何編寫makefile來在Linux上構建應用程序的大量書籍,但是我對顯然可以實現同一目標的許多不同方法感到困惑。

到目前為止,這是我提出的用於建立存檔的內容。

SHELL = /bin/sh

CXX = g++
DEBUG = -g
CXXFLAGS = -std=c++11 -Wall -pedantic #-Wextra
CPPFLAGS =  -I. \
            -I./include

SOURCES =   foo1.cpp \
            foo2.cpp \
            foo3.cpp

OBJECTS = $(SOURCES:.cpp=.o)

以下規則將每個源文件成功編譯為目標文件,然后創建一個歸檔文件:

libfoo.a: $(OBJECTS)
    ar rvcs $@ $(OBJECTS)

%.o: src/%.cpp ./include/%.h
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

這也做同樣的事情:

libfoo.a: $(OBJECTS)
    ar rvcs $@ $(OBJECTS)

$(OBJECTS) : %.o:src/%.cpp
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

但是,此操作失敗,並顯示一個錯誤,即沒有規則可以使目標'foo1.o:%。h

libfoo.a: $(OBJECTS)
    ar rvcs $@ $(OBJECTS)

$(OBJECTS) : %.o:src/%.cpp %.o:%.h
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

有人可以解釋為什么它不起作用,哪種方法最好嗎?

第一個選項將頭文件列出為依賴項,而第二個選項則沒有。 這是我選擇第三個選項的動機。

如何使用選項2或3將標頭列出為依賴項?

TIA

在嘗試#2和嘗試#3中使用的功能是靜態模式規則 ,其語法如下所示:

<targets...> : <target-pattern> : <prerequisites...>

只能有兩個冒號,不能三個。 您應該將上面的嘗試3寫為:

$(OBJECTS) : %.o : src/%.cpp %.h
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

注意一件重要的事情:如果您創建任何沒有關聯的.h文件的.cpp文件,此規則將失敗。 只是在說'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM