Я правильно использую Makefile для C ++? - PullRequest
0 голосов
/ 17 февраля 2011

Makefile

 default:
   (!)  g++ -Werror  -Wunused-variable -Wunused-value  -Wunused-function -Wfloat-equal -Wall -ansi -o main  -pedantic-errors main.cpp
        '/home/HomeName/Desktop/main'

Я использовал этот код для компиляции файла C ++.Это хороший способ использования этого кода в make-файле?Кроме того, мне интересно, есть ли в строке, отмеченной (!), Параметры компилятора в правильном порядке.

1 Ответ

5 голосов
/ 17 февраля 2011

Итак, сам ваш 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
        ./$@

Обозначения, использующие %, более гибкие, когда они доступны.

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