Итак, сам ваш make-файл не содержит пометки '(!)', Я считаю.
То, что у вас есть «работает». Он компилирует программу со строгим набором параметров и затем запускает ее по абсолютному пути.
Однако, это не очень гибко:
- он будет строить
main
только если вы запустите make
- он всегда будет строить
main
, даже если вы построили его минуту назад
- если вы запустите
make main
, он будет использовать другой набор команд для сборки программы и не будет запускать программу.
Было бы лучше - это позволило бы вам легче перемещать код - если бы строка для запуска программы использовала текущий каталог.
И было бы лучше, если бы вы использовали некоторые встроенные функции make.
Компиляторы C ++ и C очень терпимы к различным порядкам для своих опций; то, что у вас есть, в порядке.
Внутри make
компилятор C ++ известен макросу CXX; он принимает набор флагов, определенных CXXFLAGS. Поэтому вы можете использовать:
CXX = g++
CXXFLAGS_W = -Werror -Wunused-variable -Wunused-value -Wunused-function \
-Wfloat-equal -Wall
CXXFLAGS_M = -ansi -pedantic-errors
CXXFLAGS = ${CXXFLAGS_M} ${CXFLAGS_W}
all: main
./main
Это позволяет вам запускать make
, make all
и make main
и получать встроенную программу main
. Если вы используете любой из первых двух, программа также будет запущена. Программа будет перекомпилирована только в том случае, если исходный код изменился с момента последней компиляции. Если у вас есть другие программы в каталоге, например, «exerc2.cpp» и «exerc3.cpp», вы можете сказать «1033», и теперь они будут скомпилированы почти так же, как «* 1034».
Если вы действительно хотели запустить программу после ее сборки (вероятно, это не то, что вы бы делали в долгосрочной перспективе), то вы, вероятно, переписали бы правило компиляции (предполагая, что GNU Make):
% : %.cpp
${CXX} ${CXXFLAGS} -o $@ $*.cpp
./$@
Если у вас классический или POSIX вариант make
, вы должны написать:
.cpp:
${CXX} ${CXXFLAGS} -o $@ $*.cpp
./$@
Обозначения, использующие %
, более гибкие, когда они доступны.