Makefile将目标文件从源文件的不同目录放入一个单独的目录中?

Dar*_*zer 23 directory makefile object gnu-make

我正在使用UnitTest ++来允许我为某些C++代码(应该在Linux或Mac OS X上构建)创建单元测试.我有这样的目录结构:

src
- Foo.cpp
- Bar.cpp
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
UnitTest++
- libUnitTest++.a
Run Code Online (Sandbox Code Playgroud)

这个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,$<)
Run Code Online (Sandbox Code Playgroud)

但我想将所有.o文件放在"test"目录的"obj"子目录中.如何修改此Makefile?

我已经尝试将"obj /"添加到对象和test_objects变量,但我无法弄清楚如何修改%.o规则,以便它知道.o文件的位置并引用正确的.cpp文件.我是否需要创建两个单独的规则,每个规则对应一组.cpp文件?

如果不是定义src和test_src变量,我只需要Makefile为所有.cpp文件构建一个.o(到obj /)(与Makefile和./src/在同一目录中) ?

Bet*_*eta 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 $@
Run Code Online (Sandbox Code Playgroud)

  • @mezhaka,这意味着随后的先决条件(在这种情况下`obj`)是[订单仅先决条件](http://www.gnu.org/software/make/manual/make.html#Prerequisite-Types) .这意味着,如果有的话`$(对象)`必须建立在那么`obj`必须先建,但如果'obj`是过时的(或不存在),这不*不*力`$(对象)``要建造. (15认同)
  • 什么是"|" 在`$(objects)行中:| obj`代表什么? (7认同)