我正在使用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):
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,$<)
但是我想将所有.o文件放在“test”目录的“obj”子目录中。如何修改此Makefile?
我尝试在对象和test_objects变量中添加“obj /”,但我无法弄清楚如何修改%.o规则,以便知道.o文件的位置并引用正确的.cpp文件。我是否需要创建两个单独的规则,每个规则对应一组.cpp文件?
如果不是定义src和test_src变量,我只需要Makefile为所有.cpp文件构建一个.o(到obj /)(与Makefile在同一目录中和在../中) SRC /)?
答案 0 :(得分:36)
有多种方法可以做到这一点,但这是一个非常好的方法(我真的应该有热键)。
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 $@