2012-07-02 1 views
0

У меня было впечатление, что левая сторона двоеточия : представляет target, то есть исполняемый файл, а правая сторона представляет «зависимости», то есть файлы, необходимые для создания указанной цели.Какова роль цели в Makefile?

hello : hello.c 
    gcc hello.c -Wall -o hello 

Итак, я думал, что цель «привет» - это имя окончательного исполняемого файла.

executableHelloWorldFile : hello.c 
    gcc hello.c -Wall -o hello 

, но, когда я изменил «привет» на «executableHelloWorldFile», ничего не изменилось в выводе.

Я знаю, как создать цель, , но здесь я хочу понять, что в чем важна помощь target в Makefile?

+0

Вы удалили hello.exe и скомпилировали код еще раз? – doniyor

+0

@doniyor это не проблема, см. Мой ответ. –

+1

Цель подсказывает, что делать, и правило говорит, как это сделать. http://developers.sun.com/solaris/articles/make_utility.html#3ba – doniyor

ответ

1

A make target - это файл, который вы хотите перестроить.

Make не может божественное создание того, что вы хотите построить, поэтому вы должны сказать это, неявно или явно, что он должен строить. Часто первая цель в файле - это имя, такое как «все», и если вы запустили «make» без какой-либо явной цели, он построит первую цель, указанную в make-файле. Однако некоторые make-файлы не указывают какую-либо цель; то вы должны указать его в командной строке. Или, если вы не хотите, чтобы цель по умолчанию была создана, вы должны указать цель, которую хотите создать.

A makefile обычно включает в себя код, чтобы сделать вашу программу, установить вашу программу, очистить после и другие вещи.

так что слово target может быть различным ключевым словам, таким как all, install, clean, etc.

Это способ сказать что-то сделать. make все подразумевает делать все

+0

так, наконец, имя цели не обязательно является именем выходных файлов, но мы можем иметь одинаковые имена для целевых и выходных файлов по ключевым словам, таким как «$ @», «$ ^» и т. д. –

+0

@ AnishaKaul это не обязательно. ya u правы в понимании – user1089679

+0

Нет! Правильный термин для «$ @» и т. д. [автоматический переменные "] (http://www.gnu.org/software/ma KE/ручной/html_node/Автоматические Variables.html # Автоматические-переменные). Автоматические переменные "имеют значения, рассчитанные заново для каждого выполняемого правила, исходя из цели и предпосылок правила." «Target» обозначает действие, которое нужно вызвать. Что такое действие, определяется «правилом». Является ли вызов цели фактически вызовом правила, зависит от «предварительных условий». «Автоматические переменные» - это просто «сопоставление шаблонов» - они упрощают привязку правил к необходимым требованиям к целевым объектам. – paulsm4

3

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

Редактировать: ваш компилятор понятия не имеет, что он вызывает его, он выполняет именно те инструкции, которые вы ему дали (как это делает каждая компьютерная программа). Если вы скажете «-o привет», он напишет двоичный файл в файл «hello», независимо от поддельного целевого имени, с которым вы столкнулись.

+1

Нет, «цель» не обязательно считается файлом. Как насчет «сделать все» (например)? – paulsm4

+0

Вы частично правы. Все это специальная цель, но в этом конкретном случае цель * * считается * файлом. –

+0

Так почему же выходной файл получает имя 'hello' во втором случае? Я удалил предыдущий привет и снова запустил make. –

1

В правиле необходимо использовать соответствующие переменные: [email protected] - это целевые $^ - это зависимости. В вашем случае это должно быть:

executableHelloWorldFile : hello.c 
    gcc $^ -Wall -o [email protected] 

Или, когда вам нужно всего лишь обратиться к первой зависимости, использовать $<:

executableHelloWorldFile : hello.c 
    gcc $< -Wall -o [email protected] 
2
  1. Да, в вашем примере, цель «привет» приводит к созданию .exe «привет».

  2. Но нет, вы можете вызвать любое действие (или комбинацию действий) с целью.

    Например, «make clean», «make build» и «make install» и «make all» являются общими командами. Они запускают makefile, чтобы 1) очистить любой «мусор», который уже был построен, 2) перекомпилировать проект, 3) установить проект или 4) сделать все

  3. Чтобы ответить на ваш вопрос, «цель» - это просто способ сказать makefile «сделать что-то».

    В вашем примере цель будет вызывать «gcc». Но он будет вызывать его, если - и только если - исходный файл «hello.c» устарел.

  4. Файл makefile обычно состоит из многих целей, правил и определяет.

    Компонент обычно состоит из нескольких подпроектов, каждый со своим собственным make-файлом.

'Надеюсь, что поможет ...PSM

+0

вы сказали * «Но он будет вызывать его, если - и только если - исходный файл« hello.c »устарел». * На этот раз я отредактировал hello.c с пробелами. Ran сделать снова, но имя выходного файла было снова «hello», а не «executableHelloWorldFile». Это Linux –

+0

PS: цитата doniyor абсолютно правильна: «Target указывает, что делать, и правило говорит, как это сделать». – paulsm4

+1

@AnishaKaul Вы дали свое имя выходного файла, это привет, поэтому вы получаете файл hello в качестве output.executableHelloWorldFile - это ваше целевое имя не для вашего двоичного файла вывода. – user1089679

1

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

Некоторые цели (например, all и clean) обычно включаются в Make-файлы без фактических существующих файлов. Они представляют собой более крупные действия, которые пользователь может запросить с помощью команд, таких как make clean, в которых команды должны выполняться каждый раз.