Я новичок в make файлах, но хочу создать проект C++ с некоторыми модульными тестами.
Каталог моего проекта выглядит следующим образом:
makefile
src/
main.cpp
file1.cpp
file1.h
file2.cpp
file2.h
...
test/
file1_test.cpp
file2_test.cpp
...
Я хочу, чтобы makefile собирал программу в src/, а также компилировал программы в моем каталоге test/. Каждый файл * _test.cpp содержит функцию main(). Я пробовал много вещей, но каждый раз, когда я пытаюсь скомпилировать, я сталкиваюсь с какой-то новой проблемой, и мне кажется, что это должна быть довольно простая задача.
(Кстати, я был вдохновлен этим учебником http://c.learncodethehardway.org/book/ex28.html)
Спасибо за любую помощь!
РЕДАКТИРОВАТЬ:
Мой текущий make файл выглядит примерно так. (Я должен был внести некоторые изменения, чтобы соответствовать этому более общему примеру)
CFLAGS =
LIBS =
LDFLAGS = -L/usr/local/
CC = g++
SOURCES=$(wildcard src/**/*.cpp src/*.cpp)
OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))
TARGET=build/MyProgram
TEST_SRC=$(wildcard test/*_test.cpp)
TESTS=$(patsubst %.cpp,%.o,$(TEST_SRC))
TESTS_PRG=$(patsubst %.cpp,%,$(TEST_SRC))
TESTS_OBJ=$(patsubst test/%_test.cpp,src/%.o,$(TEST_SRC))
all: $(TARGET)
$(TARGET): build $(OBJECTS)
g++ -o $(OBJECTS) $(CFLAS) $(LIBS)
build:
@mkdir -p build
@mkdir -p bin
.PHONY: tests
tests: $(TESTS_OBJ)
g++ $(TESTS_OBJ) $(CFLAGS) -o $(TESTS_PRG)
clean:
rm -rf build $(OBJECTS)
rm -f tests/tests.log
find . -name "*.gc*" -exec rm {} \;
rm -rf 'find . -name "*.dSYM" -print'
Я запустил ваш make файл как есть, после исправления ошибок пробелов по всему месту.
Однако, если я это сделаю, я не получаю поведение, которое вы требуете: я получаю сообщение об ошибке g++ о том, что второй файл1_test не существует, как и ожидалось. Чтобы получить поведение, которое вы требуете, мне нужно удалить -o $ {TESTS_PRG} в конце строки рецепта правила "тесты". Причина в следующем:
Вы не можете указать несколько выходных файлов (-o) для создания нескольких программ для одного вызова компилятора. Если вы удалите -o $ {TESTS_PRG}, то компилятор попытается создать одну программу из всех указанных объектных файлов ($ {TESTS_OBJ}), и каждая из них, вероятно, будет иметь функцию main(), поскольку они должны быть разные программы. Вам нужен один вызов компилятору для каждой программы.