Makefile: компилирование нескольких файлов * .out тестового модуля в один исполняемый файл теста (C ++) - PullRequest
0 голосов
/ 25 января 2020

Пожалуйста, прости меня, если это повторный вопрос. Я довольно новичок в написании Makefiles, и поэтому я не был уверен, как найти то, что ищу.

Я знакомлюсь с Boost.Test и пишу модульные тесты для каждого файла базис.

Это моя структура каталогов:

- cpp
    - sim
        - Makefile
        - bin
        - src
            - ExampleClass.cpp
    - tests
        - Makefile
        - bin
        - src
            -ExampleClass_T.cpp

По сути, я хотел бы написать отдельные *. cpp файлы тестовых примеров с использованием Boost, как показано выше.

Вот содержимое моих тестов / Makefile:

CC = g++
CPPFLAGS = -g -v -Wall -I$(ODIR_TEST) -I$(SDIR_TEST) \
-I$(SDIR) -I$(ODIR) -I$(BOOST_ROOT)
ODIR_TEST = ./bin
SDIR_TEST = ./src
ODIR = ../sim/bin
SDIR = ../sim/src

%.out : $(SDIR_TEST)/%.cpp
        $(CC) $(CPPFLAGS) -o $< $@

при выполнении make генерируется Нет целей. Стоп. Сообщение об ошибке. Любые идеи о том, почему заставить думать, что нет цели? Не будет ли% .out действовать здесь как цель, или подстановочный знак не будет действовать таким образом?

Я понимаю, что в Makefile выше я пытаюсь сгенерировать файл * .out для каждого *. cpp файл; Кроме того, я хотел бы создать конечный исполняемый файл, который является кульминацией всех сгенерированных файлов * .out. Возможно ли это, или я подхожу к этому неправильно?

Любой другой совет или лучшие практики Makefile, особенно в отношении автоматизации тестирования, будут высоко оценены.

1 Ответ

0 голосов
/ 28 января 2020

Мне кажется, я нашел обходной путь, хотя его, вероятно, можно оптимизировать.

PROG = main
CC = g++
CPPFLAGS = -g -Wall -I$(ODIR_TEST) -I$(SDIR_TEST) \
-I$(SDIR) -I$(ODIR) -I$(BOOST_ROOT)
ODIR_TEST = ./bin
SDIR_TEST = ./src
OUTDIR = ./execs
ODIR = ../sim/bin
SDIR = ../sim/src
TEST_EXEC_NAMES = $(notdir $(basename $(wildcard $(SDIR_TEST)/*.cpp)))

# default rule (main.cpp)
$(OUTDIR)/$(PROG) : $(SDIR_TEST)/main.cpp $(TEST_EXEC_NAMES)
        $(CC) $(CPPFLAGS) -o $@ $<

% : $(SDIR_TEST)/%.cpp
        $(CC) $(CPPFLAGS) -o $(OUTDIR)/$@ $<

Я указываю цель по умолчанию в своем первом правиле. Я включаю $(TEST_EXEC_NAMES) в качестве предварительного условия, чтобы убедиться, что все мои отдельные исполняемые файлы теста построены с использованием правила шаблона.

Указание имен исполняемых имен моих файлов из их. cpp дубликатов выполняется с помощью ряда вызовов функций (подстановочный знак, базовое имя и notdir).

Опять же, это, конечно, не самый быстрый способ, которым я мог выполнить sh мою задачу, но это привело меня к ошибкам компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...