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 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、$

这个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_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 $@