web-dev-qa-db-ja.com

Makefileは、オブジェクトファイルをソースファイルのさまざまなディレクトリから1つの別のディレクトリに配置しますか?

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を変更するにはどうすればよいですか?

"obj /"をオブジェクトとtest_objects変数に追加しようとしましたが、%。oルールを変更して.oファイルの場所を認識し、正しい.cppファイルを参照する方法を理解できません。 .cppファイルのセットごとに1つずつ、2つの個別のルールを作成する必要がありますか?

Src変数とtest_src変数を定義する代わりに、Makefileですべての.cppファイル(両方ともMakefileと同じディレクトリと../src/)の.o(obj /に)を作成すると、もっと簡単になりますか? ?

23
Daryl Spitzer

それを行うには複数の方法がありますが、これはかなり良い方法です(私は本当にホットキーが必要です)。

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 $@
36
Beta