Object Makefile将来自不同目录的源文件的对象文件放在一个单独的目录中? 我使用UNITTEST ++来允许我为一些C++代码创建单元测试(应该在Linux或Mac OS X上构建)。我的目录结构如下: src - Foo.cpp - Bar.cpp test - FooTest.cpp - BarTest.cpp - Main.cpp - Makefile UnitTest++ - libUnitTest++.a
这个Makefile(改编自UnitTest++Makefile)可以很好地工作(与GNU make一起):Object Makefile将来自不同目录的源文件的对象文件放在一个单独的目录中? 我使用UNITTEST ++来允许我为一些C++代码创建单元测试(应该在Linux或Mac OS X上构建)。我的目录结构如下: src - Foo.cpp - Bar.cpp test - FooTest.cpp - BarTest.cpp - Main.cpp - Makefile UnitTest++ - libUnitTest++.a,object,directory,makefile,gnu-make,Object,Directory,Makefile,Gnu Make,这个Makefile(改编自UnitTest++Makefile)可以很好地工作(与GNU make一起): test=TestFooAndBar src=../src/Foo.cpp\ ../src/Bar.cpp test_src=Main.cpp\ FooTest.cpp\ 巴特斯特 lib=../UnitTest++/libUnitTest++.a objects=$(patsubst%.cpp、%.o、$(src)) test_objects=$(patsubst%.cpp、%.o、$
test=TestFooAndBar
src=../src/Foo.cpp\
../src/Bar.cpp
test_src=Main.cpp\
FooTest.cpp\
巴特斯特
lib=../UnitTest++/libUnitTest++.a
objects=$(patsubst%.cpp、%.o、$(src))
test_objects=$(patsubst%.cpp、%.o、$(test_src))
冒牌货:全部
全部:$(测试)
@正在运行单元测试。。。
@./$(测试)
$(测试):$(库)$(测试对象)$(对象)
@回显链接$(测试)。。。
@$(CXX)$(LDFLAGS)-o$(测试)$(测试对象)$(对象)$(库)
.假冒:干净
清洁:
-@$(RM)-f$(对象)$(测试对象)$(测试)2>/dev/null
%.o:%.cpp
@回音$<
@$(CXX)$(cxflags)-c$<-o$(patsubst%.cpp,%.o,$有多种方法可以实现,但这是一种非常好的方法(我真的应该让它热键化)
vpath%.cpp../src
src=Foo.cpp Bar.cpp
测试_src=Main.cpp FooTest.cpp BarTest.cpp
objects=$(patsubst%.cpp,obj/%.o,$(src))
test_objects=$(patsubst%.cpp,obj/%.o,$(test_src))
$(对象):|对象
obj:
@mkdir-p$@
obj/%.o:%.cpp
@echo$<
@$(CXX)$(CXXFLAGS)-c$<-o$@
行$(对象):|obj
代表什么?@mezhaka,这意味着接下来的先决条件(在本例中为obj
)是。这意味着如果必须构建任何$(对象)
,则必须首先构建obj
,但如果obj
已过时(或不存在),这并不强制构建$(objects)
。呃,它太密集了…vpath的结果去哪里了?我如何访问它的内容?这到底是什么意思?“objects=$(patsubst%.cpp,obj/%.o,$(src))”@MarcusJ我对Makefiles也是新手,所以我不知道vpath问题……我自己也很奇怪。对象=…
位查看源文件字符串中的每个文件名,并将所有出现的%.cpp
替换为obj/%.o
,其中%
是一个通配符。您可以找到一个很好的解释中的年龄。另外,请参阅。
test = TestFooAndBar
src = ../src/Foo.cpp \
../src/Bar.cpp
test_src = Main.cpp \
FooTest.cpp \
BarTest.cpp
lib = ../UnitTest++/libUnitTest++.a
objects = $(patsubst %.cpp,%.o,$(src))
test_objects = $(patsubst %.cpp,%.o,$(test_src))
.PHONY: all
all: $(test)
@echo Running unit tests...
@./$(test)
$(test): $(lib) $(test_objects) $(objects)
@echo Linking $(test)...
@$(CXX) $(LDFLAGS) -o $(test) $(test_objects) $(objects) $(lib)
.PHONY: clean
clean:
-@$(RM) -f $(objects) $(test_objects) $(test) 2> /dev/null
%.o : %.cpp
@echo $<
@$(CXX) $(CXXFLAGS) -c $< -o $(patsubst %.cpp,%.o,$<)
vpath %.cpp ../src
src = Foo.cpp Bar.cpp
test_src = Main.cpp FooTest.cpp BarTest.cpp
objects = $(patsubst %.cpp,obj/%.o,$(src))
test_objects = $(patsubst %.cpp,obj/%.o,$(test_src))
$(objects): | obj
obj:
@mkdir -p $@
obj/%.o : %.cpp
@echo $<
@$(CXX) $(CXXFLAGS) -c $< -o $@