簡體   English   中英

無法從相應的源獲取 makefile 來構建每個 object

[英]Cannot get makefile to build each object from its corresponding source

我遇到了這個 makefile 的問題。 我無法弄清楚如何從它們的對應來源構建 object 文件。 每個 obj 都是用主源構建的,而不是它的一個。

TARGET   = af_optional

SOURCES := $(wildcard src/*.cpp)
OBJECTS := $(patsubst src/%.cpp,obj/%.o,$(SOURCES))
DEPENDS := $(patsubst src/%.cpp,obj/%.d,$(SOURCES))

CXXFLAGS = -g -I.

# ADD MORE WARNINGS!
WARNING := -Wall -Wextra

# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean

# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: bin/$(TARGET)

clean:
    $(RM) $(OBJECTS) $(DEPENDS) $(TARGET)

# Linking the executable from the object files
bin/$(TARGET): $(OBJECTS)
    @echo "target : $(TARGET)"
    @echo "sources: $(SOURCES)"
    @echo "objects: $(OBJECTS)"
    @echo "depends: $(DEPENDS)"
    @mkdir -p bin
    $(CXX) $(WARNING) $(CXXFLAGS) $^ -o $@

-include $(DEPENDS)

$(OBJECTS): $(SOURCES) makefile
    @mkdir -p obj
    $(CXX) $(WARNING) $(CXXFLAGS) -MMD -MP -c $< -o $@

我在前一段時間研究時寫了這個 makefile,但是在我開始工作后我弄壞了一些東西,直到現在我才注意到,因為我必須使用的所有項目都是單一來源的。

這個規則是錯誤的:

$(OBJECTS): $(SOURCES) makefile

這擴展到什么? 如果您有來源src/foo.cppsrc/bar.cppsrc/baz.cpp ,那么它將是這樣的:

obj/foo.o obj/bar.o obj/baz.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile

這是一個非常普遍的問題:人們似乎有這樣的想法,即 make 會以某種方式處理所有這些目標和先決條件以以某種方式匹配它們,以便每個 object 文件僅依賴於相應的源文件。

但是,make 不會那樣做。 上述規則與編寫所有這些規則完全相同:

obj/foo.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile
obj/bar.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile
obj/baz.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile

現在也許您可以看到為什么您會看到您所做的行為:每個目標的第一個先決條件是完全相同的文件src/foo.cpp所以當您使用$<自動變量時,這就是您總是得到的。

您必須編寫一個構建 ONE object 的規則,然后讓我們弄清楚如何將該規則應用於所有適當的對象。

因此,要從一個源文件構建一個 object 文件,您可以使用如下模式規則:

obj/%.o : src/%.cpp makefile
        @mkdir -p obj
        $(CXX) $(WARNING) $(CXXFLAGS) -MMD -MP -c $< -o $@

這就是你所需要的。

暫無
暫無

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

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