Создание двух отдельных исполняемых файлов из make файла (g++)
В настоящее время у меня есть мой makefile, созданный для компиляции и создания довольно большого проекта. Я написал второй файл cpp с главной функцией для запуска тестов. Я хочу, чтобы они запускались раздельно, но собирались вместе, и они используют одни и те же файлы. Как это достигается?
edit. В качестве ссылки, вот мой текущий make файл. Я не уверен, как его настроить.
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]
Ответы
Ответ 1
Обычно у вас просто будет несколько целей и сделайте что-то вроде этого:
.PHONY: all target tests
all: target tests
target: ...
...
tests: ...
...
Тогда вы можете просто make
(по умолчанию - make all
) или просто make target
или make tests
по мере необходимости.
Итак, для вашего примера файла makefile вы можете иметь что-то вроде этого:
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]
Ответ 2
Вот один из способов сделать это:
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
Это работает, потому что встроенные правила существуют для компиляции объектов из источника С++ (%.o: %.cpp
) и связывания основных программ (%: %.o
).
Также обратите внимание на использование целевых значений для переменных CPPFLAGS
и CXXFLAGS
.