object - todos - Makefile para poner archivos de objeto de archivos de origen diferentes directorios en un solo directorio separado?
makefile linux c (1)
Estoy usando UnitTest ++ para permitirme crear pruebas unitarias para algunos códigos C ++ (que deberían basarse en Linux o Mac OS X). Tengo una estructura de directorios como esta:
src
- Foo.cpp
- Bar.cpp
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
UnitTest++
- libUnitTest++.a
Y este Makefile (adaptado del UnitTest ++ Makefile) funciona muy bien (con 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,$<)
Pero quiero poner todos los archivos .o en un subdirectorio "obj" del directorio "prueba". ¿Cómo modifico este Makefile para hacerlo?
Intenté agregar "obj /" a los objetos y las variables test_objects, pero no puedo entender cómo modificar la regla% .o para que sepa dónde están los archivos .o y se refiere a los archivos .cpp correctos. ¿Debo crear dos reglas separadas, una para cada conjunto de archivos .cpp?
Sería más simple si en lugar de definir las variables src y test_src, solo tengo la compilación de Makefile en .o (en obj /) para todos los archivos .cpp (tanto en el mismo directorio que en Makefile como en ../src/) ?
Hay más de una forma de hacerlo, pero esta es una muy buena (realmente debería tener ese hotkeyed).
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 $@