Makefile, чтобы поместить объектные файлы из исходных файлов разных каталогов в один отдельный каталог?
Я использую 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 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,$<)
lt;
@$(CXX) $(CXXFLAGS) -c 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,$<)
lt; -o $(patsubst %.cpp,%.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,$<)
lt;)
Но я хочу поместить все файлы .o в подкаталог obj каталога test. Как мне изменить этот Makefile для этого?
Я попытался добавить "obj /" к объектам и переменным test_objects, но не могу понять, как изменить правило% .o, чтобы оно знало, где находятся файлы .o, и ссылается на правильные файлы .cpp. Нужно ли создавать два отдельных правила, по одному для каждого набора файлов .cpp?
Было бы проще, если бы вместо определения переменных src и test_src я просто собрал Makefile .o (в obj /) для всех файлов .cpp (как в том же каталоге, что и Makefile, так и в ../src/) ?