Вот совет: в 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 настраивал их для вас, вы можете, но это не просто.См. это обсуждение для некоторых идей.