Нет правила для сборки цели linux

make: *** Нет правила для создания цели ‘install’. при попытке установить plib-1.8.5

Во-первых, я хотел бы сказать, что я новичок в Ubuntu и Linux. Я получил ошибку с sudo make install следуя инструкциям по установке plib-1.8.5. (К вашему сведению 1. Это Ubuntu 18.04 LTS. Ранее не было никакой работы. 2. Я должен был создать среду для симулятора TORCS с помощью gym_torcs.)

Я дважды проверил каталог, в котором я выполнялся, и по результатам до этой ошибки я смог найти следующие сообщения. Что мне не хватает?

Любая помощь будет оценена. Заранее благодарны за Вашу помощь.

Используемый сценарий

СООБЩЕНИЕ Я ПОЛУЧИЛ

СЛЕДУЮЩИЙ СЦЕНАРИЙ

СООБЩЕНИЕ ОБ ОШИБКЕ

1 ответ

Мне кажется, что ты делаешь ненужные вещи. В репозитории Ubuntu есть все библиотеки переносимости — проверьте поиск на packages.ubuntu.com.

Пакет Portability Libraries: Development доступен во всех версиях Ubuntu и называется как libplib-dev ,

Вы можете установить его с помощью:

и в результате вы получите ту же версию 1.8.5.
После его установки вы должны следовать вашим инструкциям дальше.

Поэтому вы всегда должны использовать поиск на https://packages.ubuntu.com/ прежде чем собирать материал самостоятельно.

Если вам действительно нужно скомпилировать библиотеку самостоятельно, прочитайте текст ниже.
Как писал @AtomiX84, вы должны убедиться, что ./configure был закончен без ошибок. Это комплексный скрипт, который проверяет системы на наличие всех необходимых инструментов сборки (компилятор, компоновщик и т. Д.) И зависимости сборки (заголовки и библиотеки).
Здесь вам может помочь APT — у него есть специальная команда для получения зависимостей сборки
sudo apt-get build-dep libplib-dev и после выполнения этой команды ./configure скрипт не подведет.

Источник

Ошибка make-файла gcc: «Нет правила для создания цели…»

Я пытаюсь использовать GCC (Linux) с make-файлом для компиляции моего проекта.

Я получаю следующую ошибку, которая не может расшифровать в этом контексте:

Обычно это потому, что у вас нет файла, который vertex.cpp можно сделать доступным. Проверь это:

  • этот файл существует.
  • вы находитесь в правильном каталоге, когда вы делаете.

Кроме этого, я не могу больше предложить. Возможно, вы могли бы дать нам список каталогов этого каталога.

По моему опыту, эта ошибка часто вызвана орфографической ошибкой.

Я получил эту ошибку сегодня.

make [1]: *** Нет правила для создания цели maintenaceDialog.cpp’, needed by maintenaceDialog.o ‘. Стоп.

В моем случае ошибка была просто орфографической ошибкой. Слово ТЕХНИЧЕСКОЕ ОБСЛУЖИВАНИЕ отсутствовало, это третий Н.

Также проверьте правильность написания ваших имен файлов.

Более распространенная причина для печати этого сообщения заключается в том, что вы забыли включить каталог, в котором находится исходный файл. В результате gcc «думает», что этот файл не существует.

Вы можете добавить каталог, используя аргумент -I для gcc.

В моем случае я использовал запятые в качестве разделителей. Чтобы использовать ваш пример, я сделал это:

Меняя его на эквивалент

Это точно? Помните, что синтаксис Makefile учитывает пробелы и требует вкладок для отступа команд под действиями.

Проблема, которую я обнаружил, была еще глупее, чем то, о чем говорили другие.

Наши make-файлы получают списки объектов для сборки. Кто-то добавил TheOtherLibrary в один из списков, как показано ниже.

Они должны были сделать это:

Если бы они сделали это вторым способом, они бы не уничтожили Library сборку. Плюс в += это очень важно.

В моем случае это было связано с ошибкой многострочного правила в Makefile. У меня было что-то вроде:

Обратная косая черта в конце списка файлов в CONFIG_OBJ1 правиле вызвала эту ошибку. Это должно быть как:

Одной из частых ошибок может быть опечатка в другом имени файла .

Ваш пример довольно прост, но то, что иногда может сбивать с толку, — это сообщения о make себе. Давайте рассмотрим пример.

Содержимое моей папки:

В то время как мой makefile выглядит

Хотя у меня есть , index.md где она должна быть , и нет никакой ошибки в названии этого, сообщение от make будет

Если честно, сообщение сбивает с толку . Это просто говорит, что нет правила. На самом деле это означает, что правило неверно, но из-за правил подстановочных знаков (шаблонов) make невозможно определить, что именно вызвало проблему.

Давайте makefile немного изменим , то есть заменим шаблоны явными правилами:

И теперь мы получим сообщение:

Чудо! Можно сделать следующие выводы:

Сообщения make зависят от правил и не всегда указывают на корень проблем

Могут быть и другие проблемы, makefile отличные от указанных в этом сообщении.

Теперь у нас есть идея проверить и другие зависимости в правиле :

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Нет правила для сборки цели `modules’. Останов.

Модератор: Bizdelnick

Нет правила для сборки цели `modules’. Останов.

Сообщение Vadya » 09.01.2009 17:58

раньше я в убунте всегда без проблем подключал инет через кпк по такой инструкции:

но на дебиане выдается такая ошибка:

————
home:/home/vadim/usb-rndis-lite# make
make -C /lib/modules/2.6.26-1-686/build SUBDIRS=/home/vadim/usb-rndis-lite modules
make[1]: Entering directory `/lib/modules/2.6.26-1-686/build’
make[1]: *** Нет правила для сборки цели `modules’. Останов.
make[1]: Leaving directory `/lib/modules/2.6.26-1-686/build’
make: *** [default] Ошибка 2
————

Подскажите как решить эту проблему. Из-за чего она возникает?

Re: Нет правила для сборки цели `modules’. Останов.

Сообщение anarhist1 » 09.01.2009 18:07

Наконец-то мне удалось установить winмодем. Спешу сообщить: дело для меня, новичка, оказалось не лёгким. По этому перед тем как всё подробно изложить считаю своим долгом выразить свою благодарность всем участникам форума которые помогли мне в этом процессе.

Итак, для начала неплох бы скачать скрипт . В архиве находится скрипт, запустив который, можно получить достаточно подробную инфу о своём модеме и его драйверах (в виде текстовых файлов, читать внимательно. ).

Тут речь пойдёт о модеме с чипсетом Intel 537EP. Скачав драйвер, нужно прочитать внимательно файл READ ME поставляемый в архиве. Важным является то, что нужно обязательно перед компилляцией и установкой драйвера установить (если не установлен) пакет kernel-devel (он идёт в рпм-пакете) для своего дистрибутива. Найти его можно на офсайте дистрибутива или же на установочном диске.

После этого всё как по инструкции:
# make clean
# export MODEM_TYPE=537EP (обязательно!)
# make 537
# make install (эта комманда должна выполняться только от имени привелегированого пользователя root)
Готово!
Желаю успехов.

Может подойдет, но в любом случае установите

kernel-devel — без него не сможете собрать

Источник

ошибка makefile gcc: «нет правила для создания цели …»

Я пытаюсь использовать GCC (linux) с makefile для компиляции моего проекта.

Я получаю следующую ошибку, которая не может расшифровать в данном контексте:

17 ответов

это обычно, потому что у вас нет файла под названием vertex.cpp доступны, чтобы сделать. Проверьте это:

  • что файл существует.
  • вы находитесь в нужном каталоге, когда вы делаете.

кроме этого, мне больше нечего предложить. Возможно, вы могли бы дать нам список каталогов этого каталога.

по моему опыту, эта ошибка часто вызвана правописание ошибка.

сегодня я получил эту ошибку.

make[1]: * * * нет правила, чтобы сделать target maintenaceDialog.cpp’, needed by maintenaceDialog.o’. Остановка.

в моем случае ошибка была просто орфографическая ошибка. Содержание слово отсутствует третья Н.

Читайте также:  Что делать если у меня пробная версия windows 10

также проверьте правописание имен файлов.

чаще всего это сообщение печатается потому, что вы забыли включить каталог, в котором находится исходный файл. В результате gcc «думает», что этот файл не существует.

вы можете добавить каталог, используя аргумент-I в gcc.

в моем случае я костляво использовал запятые в качестве разделителей. Использовать ваш пример я сделал это:

изменение его на эквивалент

Это точно? Помните, что синтаксис Makefile знает пробелы и требует вкладок для отступов команд в разделе Действия.

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

наши makefiles получают переданные списки вещей для сборки. Кто-то добавил TheOtherLibrary в один из списков, как показано ниже.

они должны были сделать это:

если бы они сделали это вторым способом, они не уничтожили бы Library построить. Плюс в += — это очень важно.

в моем случае это было связано с ошибкой многострочного правила в файле Makefile. У меня было что-то вроде:

обратная косая черта в конце списка файлов в вызвало эту ошибку. Это должно быть похоже на:

Если вы пытаетесь построить John the Ripper » bleeding-jumbo «и получить ошибку типа»make: *** нет правила, чтобы сделать целевой «linux-x86-64″». Попробуйте вместо этого запустить эту команду: ./configure && make

одной из частых ошибок может быть опечатка в имени файла.

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

содержимое моей папки:

а makefile выглядит так:

хотя у меня есть index.md где он должен быть и нет ошибки в названии, сообщение от make будет будь

если честно сообщение совершенно неправильно. Давайте alter makefile немного, то есть заменить шаблоны явными правилами:

и теперь мы получим сообщение:

чудо! Можно сделать следующий вывод:—17—>

сообщения make зависит от правил и не всегда указывает на корень проблем

могут быть и другие проблемы в вашем makefile отличается от указанного в этом

теперь мы придумали идею проверка других зависимостей в правиле а также:

только это даст нам желаемый результат:

в моем случае сообщение об ошибке ссылается на старое имя файла, которое больше не существует, потому что оно было переименовано. Оказалось, что устаревшая информация пришла не из файла Makefile, а из файлов в .deps справочники.

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

последовательные сборки с make -j 1 не были затронуты, но мне потребовалось время, чтобы понять, потому что я использую псевдоним ( make -j 8 ).

чтобы очистить состояние, я удалил все .deps files и восстановил Makefile. Вот команды, которые я использовал:

после этого здание снова заработало.

Я получил ту же ошибку, когда я копирую только исходный каталог в другое место.

Это было решено после того, как я переместил каталог сборки тоже.

в моем случае исходный и / или старые объектные файлы были заблокированы(только для чтения) полуразрушенной IDE или из резервной облачной службы, которая перестала работать должным образом. Перезапуск всех программ и служб, связанных со структурой папок, решил проблему.

еще один пример странной проблемы и ее решение:

выдает: make[3]: *** No rule to make target ‘/usr/lib/libPocoFoundationd.so’, needed by ‘../hello_poco/bin/mac/HelloPoco’. Stop.

но если я удалить Poco_LIBRARIES работает:

я использую clang8 на Mac и clang 3.9 на Linux Проблема возникает только в Linux, но работает на Mac!

Я забыл упомянуть: Poco_LIBRARIES было неправильно-он не был установлен cmake / find_package!

в моем случае путь не установлен в VPATH, после добавления ошибки ушел.

Источник

Make нет целей останов

В папке orbitToolsDemo лежит проект:

все собирается, запускается. однако make clean и make install не работают:

, дескать, «нет правила для сборки цели clean». Что не так?

версия make: GNU Make 3.82

версия ОС: Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) )

1 ответ 1

программа gnu/make, если ей не указан файл с правилами, пытается использовать такие имена файлов (именно в таком порядке): GNUmakefile , makefile и Makefile .

в том каталоге, где вы запускаете программу gnu/make, вероятно, и присутствует файл с одним из перечисленных выше имён.

а файл с именем mkf не используется (по умолчанию).

для того, чтобы указать конкретный файл, можно передать программе gnu/make опцию -f имя_файла . например:

su -c make install

Иногда, чтобы освободить место на диске, или при перекомпиляции требуется удалить результаты предыдущей сборки – объектные файлы (*.o), двоичные файлы программы и другие временные файлы. Для этого нужно выполнить команду:

Эта команда удалит вышеуказанные файлы. Операция затронет только файлы в каталоге исходников, т.е. уже установленные в системные каталоги при помощи команды make install файлы затронуты не будут.

Если вы хотите привести исходники программы к первоначальному состоянию, т.е. удалить не только двоичные файлы, но и config.log, Makefile и другие, созданные скриптом ./configure, введите:

Теперь для повторной сборки программы вам нужно будет снова запустить ./configure.

И наконец, чтобы отменить действие команды make install, т.е. удалить установленную программу, нужно, как нетрудно догадаться, выполнить:

Как и для make install, этой команде могут потребоваться права root.

Иногда при запуске make вы можете получить такие сообщения об ошибке:

make: *** Не заданы цели и не найден make-файл. Останов.

make: *** Нет правила для сборки цели ‘uninstall’. Останов.

Это связано с тем, что при запуске утилита make ищет в текущем каталоге файл с именем Makefile или makefile (различный регистр символов). Если его нет, выдается первое сообщение. Что делать в таком случае? В первую очередь проверьте, не забыли ли вы запустить скрипт ./configure, ведь именно он создает Makefile. Если при выполнении ./configure произошла ошибка, Makefile не будет создан! Во-вторых, проверьте, нет ли в каталоге с исходниками какого-то другого подобного файла:

Например, вы можете получить список файлов типа Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, что для компиляции одной и той же программы на разных платформах автор предусмотрел несколько вариантов Makefile. Другой вариант – если вы загрузили исходный код из CVS, файл будет назван Makefile.cvs. Учтите, что Makefile.in и Makefile.am не относятся к Makefile, это всего лишь заготовки для создания Makefile. Итак, если вы нашли нужный Makefile, запустите make с ключом -f, например, так:

make -f Makefile.cvs

Второе из приведенных выше сообщений об ошибке может появляться, если автор Makefile не предусмотрел такую цель (в данном случае – uninstall, т.е. автоматическое удаление программы невозможно), или, опять же, если отсутствует Makefile.

Рубрика: Программирование / Автоматизация

АНТОН ИВАНОВ

Работа с утилитой make

В статье на конкретных примерах рассматриваются варианты применения утилиты make как пользователями, так и разработчиками.

make для пользователей

Начнём с самого начала. Самое главное, но далеко не последнее применение утилиты make – это автоматическая сборка (компиляция) программ. И хотя большинство программ для Linux могут быть получены в двоичном (то есть в скомпилированном виде, в пакетах .deb, .tgz или .rpm), в процессе работы с Linux вам наверняка потребуется собрать программу самостоятельно из исходного кода.

Итак, вы загрузили архив с исходниками программы, скорее всего в виде tarball, т.е. сжатого tar-архива. Распространены две программы сжатия: gzip и bzip2 (последняя сжимает файлы лучше, но медленнее). Имена файлов таких архивов оканчиваются соответственно на .tar.gz (или .tgz) и tar.bz2 (или .tbz). Распакуйте архив командой:

Читайте также:  Windows 10 missing operating system после обновления

tar xzvf имя_файла.tar.gz

tar xjvf имя_файла.tar.bz2

Другой вид распространения исходных кодов – в пакетах .src.rpm, в этом случае просто установите такой пакет как обычно, и исходники появятся в каталоге /usr/src/RPM/SOURCES.

Первым этапом в сборке программы является настройка командой ./configure (она определяет параметры системы и создает Makefile, наиболее подходящий для данной конфигурации), но нас интересует следующий шаг – сама компиляция при помощи команды make.

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

Когда управление будет возвращено оболочке, т.е. появится приглашение ввода команд, внимательно просмотрите последние несколько строк, выведенных командой make. Если среди них есть «Error», или «Ошибка», это значит, что программа не скомпилировалась. Это может быть вызвано множеством причин: отсутствием каких-либо пакетов, ошибкой в программе, отсутствием прав записи в какой-либо файл или каталог и т. д. Еще раз внимательно перечитайте файлы README и INSTALL в каталоге с исходниками программы.

Обратите внимание, что в процессе компиляции может появляться множество предупреждений («warnings»). Они обычно вызываются небольшими несоответствиями стандарту Cи; скорее всего, они не приведут к ошибке компиляции.

Если вы сомневаетесь, нормально ли скомпилировалась программа, сразу же после завершения работы make выполните команду:

На экран будет выведен код возврата программы. Он показывает, успешно ли завершилось выполнение программы. Если он равен нулю, то всё нормально, если отличен от нуля – произошла ошибка.

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

то произойдет установка программы. Обратите внимание, что при выполнении этой команды файлы скорее всего будут скопированы в каталоги, в которые доступ на запись для простых пользователей закрыт. Поэтому вам нужно либо получить права суперпользователя (вы ведь не работаете постоянно под root, правда?), либо использовать программу su:

su -c make install

Иногда, чтобы освободить место на диске, или при перекомпиляции требуется удалить результаты предыдущей сборки – объектные файлы (*.o), двоичные файлы программы и другие временные файлы. Для этого нужно выполнить команду:

Эта команда удалит вышеуказанные файлы. Операция затронет только файлы в каталоге исходников, т.е. уже установленные в системные каталоги при помощи команды make install файлы затронуты не будут.

Если вы хотите привести исходники программы к первоначальному состоянию, т.е. удалить не только двоичные файлы, но и config.log, Makefile и другие, созданные скриптом ./configure, введите:

Теперь для повторной сборки программы вам нужно будет снова запустить ./configure.

И наконец, чтобы отменить действие команды make install, т.е. удалить установленную программу, нужно, как нетрудно догадаться, выполнить:

Как и для make install, этой команде могут потребоваться права root.

Иногда при запуске make вы можете получить такие сообщения об ошибке:

make: *** Не заданы цели и не найден make-файл. Останов.
make: *** Нет правила для сборки цели «uninstall». Останов.

Это связано с тем, что при запуске утилита make ищет в текущем каталоге файл с именем Makefile или makefile (различный регистр символов). Если его нет, выдается первое сообщение. Что делать в таком случае? В первую очередь проверьте, не забыли ли вы запустить скрипт ./configure, ведь именно он создает Makefile. Если при выполнении ./configure произошла ошибка, Makefile не будет создан! Во-вторых, проверьте, нет ли в каталоге с исходниками какого-то другого подобного файла:

Например, вы можете получить список файлов типа Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, что для компиляции одной и той же программы на разных платформах автор предусмотрел несколько вариантов Makefile. Другой вариант – если вы загрузили исходный код из CVS, файл будет назван Makefile.cvs. Учтите, что Makefile.in и Makefile.am не относятся к Makefile, это всего лишь заготовки для создания Makefile. Итак, если вы нашли нужный Makefile, запустите make с ключом -f, например, так:

make -f Makefile.cvs

Второе из приведенных выше сообщений об ошибке может появляться, если автор Makefile не предусмотрел такую цель (в данном случае – uninstall, т.е. автоматическое удаление программы невозможно), или, опять же, если отсутствует Makefile.

Вы начали компилировать программу, но вдруг. Ошибка 1. Что делать? Для начала еще раз перечитайте документацию к программе. Если ситуация не прояснилась, попробуйте запустить make с ключом -i, означающим «игнорировать все ошибки»:

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

Теперь давайте заглянем внутрь Makefile. Попробуем его немного поизменять. Откройте в своем любимом текстовом редакторе, например, Makefile из исходного кода Linux (если у вас установлены исходники Linux, то это /usr/src/linux/Makefile). Посмотрите на самые первые строчки:

Это переменные, используемые в дальнейшем при сборке ядра. Поменяв их значения, например, так:

и пересобрав ядро, вы можете потом хвастаться перед друзьями командой uname -r, которая будет показывать доставшуюся вам сверхсекретную версию ядра (3.0.0.topsecret).

Если же говорить о практическом применении, то иногда вам может потребоваться немного изменить Makefile, скажем, для того, чтобы исключить компиляцию какой-либо программы из большого пакета утилит. Пример: вы загрузили свежую версию утилит KDE (пакет kdeutils). Но какая-то программа из этого пакета никак не компилируется, и make -i не помогает. Допустим, программой, на которой происходит ошибка, является kedit. Откройте kdeutils/Makefile. Теперь просто найдите все встречающиеся слова «kedit» (в редакторе vim для этого введите /kedit) и удалите их:

TOPSUBDIRS = kdf kedit kfloppy

Это список подкаталогов с исходным кодом различных программ. Утилита make по очереди заходит в каждый из них и выполняет Makefile, находящийся в этом подкаталоге. Удалите слово kedit, сохраните файл и снова запустите make. Вы увидите, что сборка kedit будет пропущена.

make для разработчиков

Пока ваша программа состоит из одного файла, проще всего компилировать ее командой:

Теоретически можно и всю программу поместить в один файл. Однако принято разделять код на несколько файлов, в больших проектах их десятки и сотни.

Для примера создадим простую программу на C, вычисляющую квадрат числа. Она будет состоять из двух файлов: главного (main.c) и kvadrat.c, содержащего функцию возведения в квадрат. Ниже приведен исходный код этой программы:

printf(«Program calculates the square of a number. «);

printf(«Please enter an integer: «);

printf(«%d x %d = %d «, a, a, rslt);

return number * number;

Заранее скажу, что и эту программу можно скомпилировать довольно быстро без помощи Makefile командой cc *.c. Но мы все будем делать «по-правильному».

Сборка программы у нас будет разбита на два этапа: препроцессинг и компиляция, т.е. преобразование исходного кода в объектный код (файлы *.o), и сборка и линковка, т.е. объединение .o-файлов в один исполняемый файл и подключение динамических библиотек. Первый этап выполняется командой «gcc -c -o», второй – «gcc -o». gcc при запуске пытается осуществить все этапы сборки программы; параметр -c означает, что нужно только получить объектные файлы.

Итак, как вы уже знаете, утилита make ищет файл с именем Makefile. Создайте его.

Makefile состоит из набора т.н. правил. Они, в свою очередь, состоят из трех частей: цель (то, что должно быть получено в результате выполнения правила); зависимости (что требуется для получения цели); команды, которые должны быть выполнены для сборки цели. Общий синтаксис правил таков:

Читайте также:  Раздел защищенный gpt windows

цель: зависимость_1 зависимость_2 зависимость_N

Давайте рассуждать логически. Нам требуется собрать программу, пусть имя ее исполняемого файла будет «kv». У нас два файла с исходным кодом, каждый из них должен быть преобразован в .o-файл (принято называть объектные файлы так же, как и исходные файлы, но с расширением .o; в нашем случае это будут main.o и kvadrat.o). Именно они необходимы для сборки исполняемого файла, значит, они являются зависимостями. Ну а про команды уже было сказано выше. Итак, Makefile должен выглядеть так:

kv: main.o kvadrat.o

cc -o kv main.o kvadrat.o

cc -c -o main.o main.c

cc -c -o kvadrat.o kvadrat.c

Здесь нужно обратить внимание на несколько особенностей:

  • параметр -o у cc указывает имя файла, получаемого в результате операции;
  • в качестве зависимостей у целей main.o и kvadrat.o указаны соответствующие им файлы исходного кода, но это вовсе не обязательно делать. Если, скажем, файл main.c будет отсутствовать, cc и так выведет сообщение об этом. Но главная причина, по которой вам не нужно лениться и всегда указывать эту зависимость, описана чуть ниже;
  • при сборке конечной цели вызывается не только cc, но и программа strip. Она позволяет зачастую значительно сократить размер выполняемого файла, удалив из него отладочную информацию.

Для понятности я опишу логику работы утилиты make с этим Makefile: сначала проверяется наличие файла main.o – первой зависимости у цели kv. Если его нет, то выполняется его компиляция, если есть, то проверяется, не был ли изменен файл main.c с момента последней его компиляции (вот зачем нужно указывать main.c как зависимость для main.o!). Если он был изменен, он компилируется заново. Если же он не был изменен, то просто пропускается; таким образом при повторной сборке можно значительно сократить затрачиваемое время.

Далее та же проверка происходит и для kvadrat.o, и как только будут получены main.o и kvadrat.o, включающие все изменения в исходном коде, начнется сборка исполняемого файла.

Итак, сохраните Makefile и запустите make. Должны появиться два .o-файла и сам исполняемый файл kv. Для проверки запустите его:

Теперь давайте добавим в Makefile еще одну цель: clean. При вводе make clean должны удаляться три полученных в результате компиляции файла. Допишите в конец Makefile такие строки:

Сохранив Makefile, введите make clean. Все три двоичных файла будут удалены.

Теперь создадим последнюю цель – install. Она будет служить для копирования двоичного файла программы в системный каталог.

Тут есть несколько вариантов. Во-первых, можно сделать так, чтобы при выполнении make install проверялось, была ли уже скомпилирована программа, и если нет, то перед установкой выполнялась бы ее компиляция (логично, не правда ли?). Это можно сделать, указав kv в качестве зависимости. Во-вторых, для копирования программы в системный каталог можно использовать или традиционный метод – утилиту cp, а можно – специально предназначенную для этого программу install. Она может при установке заодно изменять права доступа к программе, удалять из нее отладочную информацию (но мы это уже предусмотрели при помощи команды strip); нам же понадобится такая возможность, как автоматическое создание каталогов по указанному пути. Возможно, это звучит запутанно, так что я поясню. Мы установим программу в каталог /opt/kv/ (каталог /opt предназначен для хранения пользовательских программ, необязательных для функционирования системы). Разумеется, этого каталога еще не существует, поэтому, если бы мы использовали для установки команду «cp kv /opt/kv/», это привело бы к ошибке. Если же использовать команду install с ключом -D, она автоматически создаст все отстутствующие каталоги. Кроме того, нам нужно будет сделать так, чтобы никто, кроме root, не мог выполнять программу, а смог только считывать ее файл (права доступа r-xr—r—, или 544 в восьмеричном виде).

Добавьте в конец Makefile следующие строки:

install -D -m 544 kv /opt/kv/kv

Запустите make install, затем введите команду:

чтобы убедиться в правильности установки.

После параметра -m у команды install указываются права доступа, предпоследним параметром – файл, который нужно скопировать, последним параметром является каталог назначения с именем файла (т.е. исполняемый файл можно установить под другим именем, введя, например, /opt/kv/program_name в качестве последнего параметра).

Теперь поговорим о переменных. Представьте, что вам нужен Makefile для более сложного проекта, где в каталог назначения копируется одновременно несколько файлов. Вы укажете путь установки для каждого из них, например, так:

install /opt/kv/file2 и т.д.

Но вдруг вам потребовалось изменить путь установки. Вам придется поменять параметр у каждой команды. И хотя это можно сделать относительно быстро при помощи команды «заменить» в текстовом редакторе, проще всего определить переменную один раз в начале Makefile и потом использовать ее (при необходимости изменяя только ее значение). Добавьте в начало Makefile определение переменной:

И затем измените команду install таким образом:

install -D -m 544 kv $(INSTALL_PATH)/kv

На что здесь нужно обратить внимание:

  • в объявлении переменной указывается просто ее имя, а когда вы ее используете – знак $ и имя;
  • если имя переменной состоит более чем из одного символа, при ее использовании нужно заключать такое имя в скобки;
  • нужно или нет ставить косую черту в значении переменной (/opt/kv/ или /opt/kv)? Ответ: лучше перестраховаться и поставить. Как вы можете заметить, в команде установки косая черта идет подряд дважды: /opt/kv//kv (одна косая черта из значения переменной, другая – из записи $(INSTALL_PATH)/kv). Это не приведет к ошибке – вы можете поставить символ «/» хоть десять раз подряд. А вот если забудете поставить ее хотя бы один раз, то результаты, ясное дело, будут отличаться от ожидаемых.

Теперь рассмотрим такой момент: допустим, нужно выполнить некоторую команду и присвоить переменной выводимое этой командой значение. Например, если для разных версий ядра Linux существуют разные версии вашей программы. В таком случае при выполнении установки программы на системе с ядром 2.6.1 можно установить ее в каталог /opt/kv/2.6.1/, а если система запущена с ядром 2.4.24 – в каталог /opt/kv/2.4.24/. Версию ядра можно определить при помощи команды uname -r (попробуйте выполнить ее, чтобы посмотреть вашу версию ядра). Вопрос в том, как же передать полученное значение переменной? Очень просто:

INSTALL_PATH = /opt/kv/`uname -r`/

Теперь установка будет производиться в каталог /opt/kv/версия_вашего_ядра/. Обратите внимание на косые кавычки: они вводятся при помощи Shift+

(крайняя левая клавиша в ряду кнопок с цифрами).

И последнее: а ведь make может использоваться не только для компиляции программ! Например, можно использовать Makefile для сборки документации, да и вообще для автоматизации любой работы. Для примера можно создать программу, которая по команде make автоматически определяет, какие из трех файлов с именами «1», «2», «3» изменились, и при необходимости выполняет их резервное копирование в каталог backup, а по окончании работы выводит сообщение «Backup completed»:

backup: backup/1 backup/2 backup/3

Домашнее задание для вас: разберитесь, как работает этот пример, а к первому добавьте цель uninstall, так, чтобы при выполнении команды make uninstall установленная программа удалялась.

Если вас заинтересовала эта тема, прочитайте руководства «man install», «man make», а также GNU Make Manual по адресу http://www.gnu.org/software/make/manual/html_mono/make.html.gz (150 Кб). И главное – больше экспериментируйте!

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Источник

Оцените статью