2011-03-04 14 views
13

Actualmente, tengo mi archivo MAKE configurado para compilar y hacer un proyecto bastante grande. He escrito un segundo archivo cpp con la función principal para ejecutar pruebas. Quiero que estos se ejecuten por separado, pero compilar juntos y usan los mismos archivos. ¿Cómo se logra esto?Creando dos ejecutables separados de un archivo MAKE (g ++)

editar: Como referencia, aquí está mi archivo MAKE actual. No estoy seguro de cómo ajustarlo.

CC=g++ 
CFLAGS=-c -Wall -DDEBUG -g 
LDFLAGS= 
SOURCES=main.cpp Foo.cpp Bar.cpp Test.cpp A.cpp B.cpp C.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=myprogram 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

Respuesta

17

Normalmente sólo tendría múltiples objetivos y hacer algo como esto:

.PHONY: all target tests 

all: target tests 

target: ... 
    ... 

tests: ... 
    ... 

a continuación, puedes make (por defecto make all), o simplemente make target o make tests según sea necesario.

Así, por tu ejemplo makefile anterior es posible que desee tener algo como esto:

CC = g++ 
CFLAGS = -c -Wall -DDEBUG -g 
LDFLAGS = 
COMMON_SOURCES = Foo.cpp Bar.cpp A.cpp B.cpp C.cpp 
TARGET_SOURCES = main.cpp 
TEST_SOURCES = test_main.cpp 
COMMON_OBJECTS = $(COMMON_SOURCES:.cpp=.o) 
TARGET_OBJECTS = $(TARGET_SOURCES:.cpp=.o) 
TEST_OBJECTS = $(TEST_SOURCES:.cpp=.o) 
EXECUTABLE = myprogram 
TEST_EXECUTABLE = mytestprogram 

.PHONY: all target tests 

all: target tests 

target: $(EXECUTABLE) 

tests: $(TEST_EXECUTABLE) 

$(EXECUTABLE): $(COMMON_OBJECTS) $(TARGET_OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] 

$(TEST_EXECUTABLE): $(COMMON_OBJECTS) $(TEST_OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 
+0

Estoy seguro de que esta respuesta es correcta, pero no tengo experiencia con los archivos MAKE. He publicado mi actual en la publicación. ¿Debería tener 2 líneas "FUENTES =" (con diferentes nombres, obviamente), donde 1 incluye la main.cpp y una incluye la prueba principal, y luego para la referencia de destino la que tiene main? Un poco confundido – socks

0

Aquí hay una manera de hacerlo:

CXXFLAGS += -std=c++11 -Wall -O3 

all: myprog mytest 

myprog.cpp: main.cpp 
    cp -vf $< [email protected] 
myprog: myprog.o Foo.o Bar.o Test.o A.o B.o C.o 

mytest.cpp: main.cpp 
    cp -vf $< [email protected] 
mytest.o: CPPFLAGS += -DDEBUG 
mytest.o: CXXFLAGS += -O0 -g 
mytest: mytest.o Foo.o Bar.o Test.o A.o B.o C.o 

Esto funciona porque built-in rules existen para la elaboración de objetos de C++ fuente (%.o: %.cpp) y enlaces de programas principales (%: %.o).

También tenga en cuenta el uso de target-specific valores para las variables CPPFLAGS y CXXFLAGS.

Cuestiones relacionadas