![](/img/trans.png)
[英]Makefile: copy perl/python files from source directory into build directory
[英]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.cpp
、 src/bar.cpp
和src/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.