Подтвердить что ты не робот

Makefile для размещения объектных файлов из исходных файлов разных каталогов в один отдельный каталог?

Я использую UnitTest ++, чтобы позволить мне создавать модульные тесты для некоторого кода на С++ (который должен основываться на Linux или Mac OS X). У меня такая структура каталогов:

src
- Foo.cpp
- Bar.cpp
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
UnitTest++
- libUnitTest++.a

И этот Makefile (адаптированный из файла Makefile UnitTest ++) прекрасно работает (с 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:
    [email protected]$(RM) -f $(objects) $(test_objects) $(test) 2> /dev/null

%.o : %.cpp
    @echo $<
    @$(CXX) $(CXXFLAGS) -c $< -o $(patsubst %.cpp,%.o,$<)

Но я хочу поместить все файлы .o в поддиректорию "obj" в каталоге "test". Как мне изменить этот Makefile?

Я попытался добавить "obj/" к объектам и переменным test_objects, но я не могу понять, как изменить правило%.o, чтобы он знал, где находятся файлы .o, и ссылается на правильный .cpp файлы. Мне нужно создать два отдельных правила: по одному для каждого набора файлов .cpp?

Было бы проще, если вместо определения переменных src и test_src у меня просто есть Makefile build a.o(в obj/) для всех .cpp файлов (оба в том же каталоге, что и Makefile и в../SRC/)?

4b9b3361

Ответ 1

Там более одного способа сделать это, но это довольно хорошо (я действительно должен был иметь эту горячую клавишу).

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 [email protected]

obj/%.o : %.cpp
  @echo $< 
  @$(CXX) $(CXXFLAGS) -c $< -o [email protected]