сделать две программы в одной команде

Вопрос или проблема

Я хочу создать свои основные и тестовые программы с помощью makefile.

Я пытался запустить эту команду make, но она компилирует только library_management:

# Компилятор и флаги
CXX = g++
CXXFLAGS = -std=c++11 -Iinclude

# Директории
SRC_DIR = src
INCLUDE_DIR = include
TEST_DIR = tests

# Исполняемые файлы
MAIN_EXEC = library_management
TEST_EXEC = library_test

# Исходные файлы
MAIN_SRC = $(SRC_DIR)/main.cpp $(SRC_DIR)/Book.cpp $(SRC_DIR)/Library.cpp
TEST_SRC = $(TEST_DIR)/LibraryTest.cpp $(SRC_DIR)/Book.cpp $(SRC_DIR)/Library.cpp

# Сборка основной программы
$(MAIN_EXEC): $(MAIN_SRC)
    $(CXX) $(CXXFLAGS) -o $(MAIN_EXEC) $(MAIN_SRC)

# Сборка тестовой программы
$(TEST_EXEC): $(TEST_SRC)
    $(CXX) $(CXXFLAGS) -o $(TEST_EXEC) $(TEST_SRC)

Я нашел способ сделать каждый проект с другой командой. Но затем мне нужно запускать команды make и make test, чтобы собрать оба проекта.

# Цель по умолчанию: собирать только основную программу
all: $(MAIN_EXEC)

# Сборка основной программы
$(MAIN_EXEC): $(MAIN_SRC)
    $(CXX) $(CXXFLAGS) -o $(MAIN_EXEC) $(MAIN_SRC)

# Сборка тестовой программы
test: $(TEST_EXEC)

$(TEST_EXEC): $(TEST_SRC)
    $(CXX) $(CXXFLAGS) -o $(TEST_EXEC) $(TEST_SRC)

Существует ли возможность собрать оба проекта в одной команде make?

Спасибо!

Как прокомментировал @some-programmer-dude, я добавил оба проекта в команду all, и теперь он собирает оба проекта:

all:$(MAIN_EXEC) $(TEST_EXEC)

Мой makefile теперь выглядит так:

# Компилятор и флаги
CXX = g++
CXXFLAGS = -std=c++11 -Iinclude

# Директории
SRC_DIR = src
INCLUDE_DIR = include
TEST_DIR = tests

# Исполняемые файлы
MAIN_EXEC = library_management
TEST_EXEC = library_test

# Исходные файлы
MAIN_SRC = $(SRC_DIR)/main.cpp $(SRC_DIR)/Book.cpp $(SRC_DIR)/Library.cpp
TEST_SRC = $(TEST_DIR)/LibraryTest.cpp $(SRC_DIR)/Book.cpp $(SRC_DIR)/Library.cpp

# Цель по умолчанию: собирать только основную программу
all:$(MAIN_EXEC) $(TEST_EXEC)

# Сборка основной программы
$(MAIN_EXEC): $(MAIN_SRC)
    $(CXX) $(CXXFLAGS) -o $(MAIN_EXEC) $(MAIN_SRC)

# Сборка тестовой программы
# test: $(TEST_EXEC)

$(TEST_EXEC): $(TEST_SRC)
    $(CXX) $(CXXFLAGS) -o $(TEST_EXEC) $(TEST_SRC)

# Очистка
clean:
    rm -f $(MAIN_EXEC) $(TEST_EXEC)

Ответ или решение

Для интеграции двух программ в одном Makefile вы успешно применили подход, при котором собираются как основная программа, так и тестовая, с помощью одной команды make. Давайте подробно рассмотрим, как вы можете оптимизировать ваш Makefile, чтобы сделать его более читабельным и эффективным.

Полный Makefile

Вот предложенный вами вариант Makefile с небольшими модификациями для ясности и упрощенности:

# Компилятор и флаги
CXX = g++
CXXFLAGS = -std=c++11 -Iinclude

# Каталоги
SRC_DIR = src
INCLUDE_DIR = include
TEST_DIR = tests

# Исполняемые файлы
MAIN_EXEC = library_management
TEST_EXEC = library_test

# Исходные файлы
MAIN_SRC = $(SRC_DIR)/main.cpp $(SRC_DIR)/Book.cpp $(SRC_DIR)/Library.cpp
TEST_SRC = $(TEST_DIR)/LibraryTest.cpp $(SRC_DIR)/Book.cpp $(SRC_DIR)/Library.cpp

# Целевой по умолчанию: сборка основной и тестовой программ
all: $(MAIN_EXEC) $(TEST_EXEC)

# Сборка основной программы
$(MAIN_EXEC): $(MAIN_SRC)
    $(CXX) $(CXXFLAGS) -o $(MAIN_EXEC) $(MAIN_SRC)

# Сборка тестовой программы
$(TEST_EXEC): $(TEST_SRC)
    $(CXX) $(CXXFLAGS) -o $(TEST_EXEC) $(TEST_SRC)

# Очистка для удаления исполняемых файлов
clean:
    rm -f $(MAIN_EXEC) $(TEST_EXEC)

Пояснение структуры Makefile

  1. Компилятор и флаги: Укажите используемый компилятор и нужные флаги, чтобы обеспечить совместимость и подключение необходимых заголовочных файлов.

  2. Каталоги и файлы: Определите переменные для каталогов и файлов, чтобы избежать дублирования пути в случае изменений в структуре проекта.

  3. Целевой по умолчанию (all): Команда all указывает, что при вызове make будут собраны как основная, так и тестовая программы. Это позволяет упростить процесс сборки.

  4. Правила сборки: Для каждой программы вы создали отдельные правила с указанием зависимостей. Это позволяет make автоматически определить, нуждается ли программа в пересборке при изменении исходных файлов.

  5. Очистка: Команда clean предназначена для удаления скомпилированных файлов. Это полезно для поддержания в чистоте рабочего каталога.

Преимущества

  • Упрощение процесса сборки: Один вызов make будет собирать обе программы, что делает управление проектом более удобным.
  • Читабельность: Структурированный подход улучшает читаемость файла, что облегчает поддержку и дальнейшие изменения.
  • Автоматизация зависимостей: make автоматически отслеживает зависимости между файлами, что предотвращает ошибки сборки и допускает более эффектный процесс компиляции.

Заключение

Усовершенствованный Makefile не только делает процесс сборки ваших программ более эффективным, но и улучшает организацию кода в проекте. Это позволит вам сосредоточиться на разработке и тестировании, минимизируя время, затрачиваемое на сборку. Настоятельно рекомендуем следовать предложенным шагам и адаптировать их под свои текущие нужды для достижения наилучших результатов.

Оцените материал
Добавить комментарий

Капча загружается...