una todos texto pasar para nombres make los lista fichero ejecutar crear consola como comando carpeta archivos object directory makefile gnu-make

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