Создание двух отдельных исполняемых файлов из make-файла (g ++) - PullRequest
13 голосов
/ 04 марта 2011

В настоящее время у меня настроен make-файл для компиляции и создания довольно большого проекта. Я написал второй файл 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 $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

Ответы [ 2 ]

17 голосов
/ 04 марта 2011

Обычно вы бы просто имели несколько целей и делали что-то вроде этого:

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

$(TEST_EXECUTABLE): $(COMMON_OBJECTS) $(TEST_OBJECTS)
    $(CC) $(LDFLAGS) $^ -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@
0 голосов
/ 06 января 2016

Вот один из способов сделать это:

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

all: myprog mytest

myprog.cpp: main.cpp
    cp -vf $< $@
myprog: myprog.o Foo.o Bar.o Test.o A.o B.o C.o

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

Это работает, потому что встроенные правила существуют для компиляции объектов из источника c ++ (%.o: %.cpp) и связывания основных программ (%: %.o).

Также обратите внимание на использование целевых значений для переменных CPPFLAGS и CXXFLAGS.

...