Makefile с несколькими исполняемыми файлами и зависимостями - PullRequest
0 голосов
/ 19 мая 2018

Пока у меня есть Makefile, который выглядит следующим образом:

# Program list:
# a.cpp, a.h,
# b.cpp, b.h,
# c.cpp. c.h,
# d.cpp, d.h,
# commonA.cpp, commonA.h,
# commonB.cpp, commonB.h,
# mainA.cpp, mainB.cpp,
# mainC.cpp, mainD.cpp.


CXX=g++
CXXFLAGS = -std=c++11 -g -Wall

prog1: mainA.cpp a.cpp
    $(CXX) $(CXXFLAGS) programOne mainA.cpp a.cpp

prog2: mainB.cpp b.cpp
    $(CXX) $(CXXFLAGS) programTwo mainB.cpp b.cpp

prog3: mainC.cpp c.cpp commonA.cpp
    $(CXX) $(CXXFLAGS) programThree mainC.cpp c.cpp commonA.cpp

prog4: mainD.cpp d.cpp commonA.cpp commonB.cpp
    $(CXX) $(CXXFLAGS) programFour mainD.cpp d.cpp commonA.cpp commonB.cpp
# etc...

Я посмотрел документацию make GNU, и это довольно сложно - я пытался понять столько, сколькоЯ могу от этого.Мне было интересно, учитывая мой пример, как я смогу сократить это даже больше, чем это в настоящее время?Есть ли хорошее правило для использования, которое может сделать все объектные файлы для каждого из файлов в списке программ выше, и затем я включу конкретные объекты для каждой части?Любая помощь очень ценится!

1 Ответ

0 голосов
/ 19 мая 2018

Вот совет: в make есть встроенные правила, которые знают, как создавать различные типы целей.Используя их, вы получите максимально короткий make-файл.

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

Например, вы уже знаете, что исходный файл foo.cpp будет скомпилирован в объектфайл foo.o.У Make есть встроенное правило, которое справится с этим за вас.Если вы также решили назвать один из ваших исходных файлов так, чтобы он соответствовал имени программы, которую вы хотите создать, вы можете воспользоваться встроенным правилом, которое также будет связывать вашу программу.

Как упомянуто в комментариях выше, ваши правила нарушены, потому что цель makefile названа одной вещью (например, prog1), но строка ссылки генерирует другую вещь: programOne (здесь я предполагаю, что вы просто забыли -o опция в строке ссылки, когда вы публикуете свой код ... пожалуйста, помните, что при обращении за помощью в SO - или в любом другом месте - лучше всего создать SSCE ).Это никогда не должно происходить для не особой цели;каждое правило должно создавать файл с тем же именем, что и у цели.

Как правило, для программ на C / C ++ исходный файл, содержащий main(), называется так же, как и программа, которую вы хотите создать.Так, например, если вы хотите создать программу programOne, исходный файл, содержащий main(), должен иметь имя programOne.cpp.

Если вы будете следовать этим рекомендациям, весь ваш make-файл может быть просто:

CXX = g++
CXXFLAGS = -std=c++11 -g -Wall

all: programOne

programOne: programOne.o a.o

и все.Make знает, как построить эти цели для вас, так что вам не нужно об этом говорить.Если вам нужно больше программ, просто добавьте их:

all: programOne programTwo

programOne: programOne.o a.o
programTwo: programTwo.o b.o

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

programOne.o: programOne.h a.h

и т. Д.Это очень просто, но утомительно поддерживать.Если вы хотите, чтобы make настраивал их для вас, вы можете, но это не просто.См. это обсуждение для некоторых идей.

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