Make команда не найдена ubuntu

Обновлено: 02.07.2024

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

Мое упорное игнорирование make в течении долгого времени, было обусловлено удобством используемых IDE, и нежеланием разбираться в этом 'пережитке прошлого' (по сути — ленью). Однако, все эти надоедливые кнопочки, менюшки ит.п. атрибуты всевозможных студий, заставили меня искать альтернативу тому методу работы, который я практиковал до сих пор. Нет, я не стал гуру make, но полученных мною знаний вполне достаточно для моих небольших проектов. Данная статья предназначена для тех, кто так же как и я еще совсем недавно, желают вырваться из уютного оконного рабства в аскетичный, но свободный мир шелла.

Make- основные сведения

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

1) целями (то, что данное правило делает);
2) реквизитами (то, что необходимо для выполнения правила и получения целей);
3) командами (выполняющими данные преобразования).

В общем виде синтаксис makefile можно представить так:

То есть, правило make это ответы на три вопроса:


Несложно заметить что процессы трансляции и компиляции очень красиво ложатся на эту схему:

Простейший Makefile

Предположим, у нас имеется программа, состоящая всего из одного файла:


Для его компиляции достаточно очень простого мэйкфайла:


Данный Makefile состоит из одного правила, которое в свою очередь состоит из цели — «hello», реквизита — «main.c», и команды — «gcc -o hello main.c». Теперь, для компиляции достаточно дать команду make в рабочем каталоге. По умолчанию make станет выполнять самое первое правило, если цель выполнения не была явно указана при вызове:

Компиляция из множества исходников

Предположим, что у нас имеется программа, состоящая из 2 файлов:
main.c

Makefile, выполняющий компиляцию этой программы может выглядеть так:


Он вполне работоспособен, однако имеет один значительный недостаток: какой — раскроем далее.

Инкрементная компиляция

Представим, что наша программа состоит из десятка- другого исходных файлов. Мы вносим изменения в один из них, и хотим ее пересобрать. Использование подхода описанного в предыдущем примере приведет к тому, что все без исключения исходные файлы будут снова скомпилированы, что негативно скажется на времени перекомпиляции. Решение — разделить компиляцию на два этапа: этап трансляции и этап линковки.

Теперь, после изменения одного из исходных файлов, достаточно произвести его трансляцию и линковку всех объектных файлов. При этом мы пропускаем этап трансляции не затронутых изменениями реквизитов, что сокращает время компиляции в целом. Такой подход называется инкрементной компиляцией. Для ее поддержки make сопоставляет время изменения целей и их реквизитов (используя данные файловой системы), благодаря чему самостоятельно решает какие правила следует выполнить, а какие можно просто проигнорировать:


Попробуйте собрать этот проект. Для его сборки необходимо явно указать цель, т.е. дать команду make hello.
После- измените любой из исходных файлов и соберите его снова. Обратите внимание на то, что во время второй компиляции, транслироваться будет только измененный файл.

После запуска make попытается сразу получить цель hello, но для ее создания необходимы файлы main.o и hello.o, которых пока еще нет. Поэтому выполнение правила будет отложено и make станет искать правила, описывающие получение недостающих реквизитов. Как только все реквизиты будут получены, make вернется к выполнению отложенной цели. Отсюда следует, что make выполняет правила рекурсивно.

Фиктивные цели

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


Командой make производят компиляцию программы, командой make install — установку. Такой подход весьма удобен, поскольку все необходимое для сборки и развертывания приложения в целевой системе включено в один файл (забудем на время о скрипте configure). Обратите внимание на то, что в первом случае мы не указываем цель, а во втором целью является вовсе не создание файла install, а процесс установки приложения в систему. Проделывать такие фокусы нам позволяют так называемые фиктивные (phony) цели. Вот краткий список стандартных целей:

  • all — является стандартной целью по умолчанию. При вызове make ее можно явно не указывать.
  • clean — очистить каталог от всех файлов полученных в результате компиляции.
  • install — произвести инсталляцию
  • uninstall — и деинсталляцию соответственно.


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

Обратите внимание на то, что в цели all не указаны команды; все что ей нужно — получить реквизит hello. Зная о рекурсивной природе make, не сложно предположить как будет работать этот скрипт. Так же следует обратить особое внимание на то, что если файл hello уже имеется (остался после предыдущей компиляции) и его реквизиты не были изменены, то команда make ничего не станет пересобирать. Это классические грабли make. Так например, изменив заголовочный файл, случайно не включенный в список реквизитов, можно получить долгие часы головной боли. Поэтому, чтобы гарантированно полностью пересобрать проект, нужно предварительно очистить рабочий каталог:


Для выполнения целей install/uninstall вам потребуются использовать sudo.

Переменные

Все те, кто знакомы с правилом DRY (Don't repeat yourself), наверняка уже заметили неладное, а именно — наш Makefile содержит большое число повторяющихся фрагментов, что может привести к путанице при последующих попытках его расширить или изменить. В императивных языках для этих целей у нас имеются переменные и константы; make тоже располагает подобными средствами. Переменные в make представляют собой именованные строки и определяются очень просто:


Существует негласное правило, согласно которому следует именовать переменные в верхнем регистре, например:


Так мы определили список исходных файлов. Для использования значения переменной ее следует разименовать при помощи конструкции $(<VAR_NAME>); например так:


Ниже представлен мэйкфайл, использующий две переменные: TARGET — для определения имени целевой программы и PREFIX — для определения пути установки программы в систему.


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

Автоматические переменные

Автоматические переменные предназначены для упрощения мейкфайлов, но на мой взгляд негативно сказываются на их читабельности. Как бы то ни было, я приведу здесь несколько наиболее часто используемых переменных, а что с ними делать (и делать ли вообще) решать вам:

  • $@ Имя цели обрабатываемого правила
  • $< Имя первой зависимости обрабатываемого правила
  • $^ Список всех зависимостей обрабатываемого правила

Заключение

В этой статье я попытался подробно объяснить основы написания и работы мэйкфайлов. Надеюсь, что она поможет вам приобрести понимание сути make и в кратчайшие сроки освоить этот провереный временем инструмент.

Случилось мне сегодня заняться установкой Asterisk 18 на новую виртуальную машину на Centos 8. Поставил версиб ОС базовую, без лишнего мусора. В процессе установки дополнительных модулей Asterisk, а именно LibPRI столкнулся с проблемой. Ошибка make: command not found может вылезти при установке любого ПО из исходников.

Необходимо было скачать пакет и выполнить его компиляцию, команда make. Однако, как оказалось, данная команда не входит в базовую поставку Centos 8. Сейчас мы это дело исправим.

Установка пакета make

Рассмотрим установку пакета make в разных операционных системах. Не забываем что установка ПО происходит от пользователя с правами root. Если вы в системе не под root используйте sudo.

Centos 8


Centos 7 (Red Hat и прочие RPM подобные)

Ubuntu (Debian и прочие DEB подобные)

Мы установили нужный нам пакет make. Для полноценной работы советую установить несколько пакетов входящих в группу Development tools. Пакет make также туда входит и еще много других, которые наверняка пригодятся при установке ПО.

Установка Development tools

Centos 8


Как видно из скриншота пакет Development tools имеет не малый размер. Но по современным меркам он уже не кажется каким то огромным. Считаю что его установка полностью себя оправдает в дальнейшем использовании системы.

Centos 7 (Red Hat и прочие RPM подобные)

Установка Build essential

В Ubuntu пакет содержащий make, а также остальные необходимые в том числе для компиляции приложений называется build-essential

Чтобы не столкнуться с ошибкой make: command not found конечно, можно сразу при установке системы ставить полный комплект. Однако вместе с ним будет установлено много не нужных программ, которые скорее всего никогда не пригодятся.

Записал коротенькое видео по данной теме

не работает команда make (не получается откомпилировать через make даже простенькие файлы)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

не работает команда make

как бы это Вы перевели на русский?

как бы это Вы перевели на русский?

как бы это Вы перевели на русский?

Я бы например перевел, это так:
1.Открыл терминал
2. Дал бы команду su yum install make

как бы это Вы перевели на русский?

Я бы например перевел, это так:
1.Открыл терминал
2. Дал бы команду su yum install make


не так не получается оно принимет yum за имя пользователя
[int@int program]$ su yum install make
su: user yum does not exist

как бы это Вы перевели на русский?

Я бы например перевел, это так:
1.Открыл терминал
2. Дал бы команду su do yum install make

так лучше будет

как бы это Вы перевели на русский?[quote]

Я бы например перевел, это так:
1.Открыл терминал
2. Дал бы команду su do yum install make
[quote]
так тоже не хочет
[int@int program]$ sudo yum install make
[sudo] password for int:
int is not in the sudoers file. This incident will be reported.

твой юзер int не имеет прав для получения привилегий root. Кури /etc/sudoers )))) make может уже и есть, зачем его ставить, надо сначала убедиться что его нет
твой юзер int не имеет прав для получения привилегий root. Кури /etc/sudoers ))))
int это пользователь root) по поводу /etc/sudoers ничего не могу сказать) твой юзер int не имеет прав для получения привилегий root. Кури /etc/sudoers ))))
int это пользователь root) по поводу /etc/sudoers ничего не могу сказать)

тогда проделай операции, которые посоветовал Encore, если же make не найдется, то просто yum install make

тогда проделай операции, которые посоветовал Encore, если же make не найдется, то просто yum install make
[quote]
попробывал вот что получилось
[int@int program]$ whereis make
make:
[int@int program]$ which make
/usr/bin/which: no make in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/int/bin)
[int@int program]$ locate make
/etc/makedev.d
/etc/cron.daily/makewhatis.cron
/etc/cron.weekly/makewhatis.cron
/etc/mail/make
/etc/makedev.d/00macros
/etc/makedev.d/01alsa
. и дальше большой список
при наборе su -
[int@int program]$ su -
Password:
[root@int

Total download size: 480 k
Is this ok [y/N]: y
Downloading Packages:
make-3.81-14.fc10.i386.rpm | 480 kB 00:02
=============================== Entering rpm code ================================
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : make 1/1
================================ Leaving rpm code ================================

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

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

Мы можем разделить ошибки на три категории:

Ошибки при выполнении команды ./configure

Ошибки при выполнении команды make

Ошибки при выполнении команды make install

Очевидно, что ошибки при выполнении команды ./configure, возникают во время выполнения скрипта конфигурации, ошибки при выполнении команды make возникают во время выполнения команды make, а ошибки при выполнении команды make install, соответственно, возникают при выполнении команды make install. Далее будет представлен лист типичных ошибок и способ их решения, разделенный на эти три категории.

Ошибки при выполнении команды ./configure

Следующий список содержит некоторые общие ошибки, которые может выдать каманда ./configure. Ошибки отсортированы по частоте возникновения. Сначала наиболее часто встречающиеся. Вещи между ( и ) являются опциональными, они могут не появлятся. OR, выделенное жирным курсивом означает, что несколько ошибок имеют одно решение. Текст между < и > показывает тип строки, которая должна появиться в этом месте.

Это обычно означает что -dev или -devel версия пакета ,который называется <somename> не установлена у вас на компьютере. Используйте менеджер пакетов вашего дистрибутива (или любой другой способ найти и установить пакет), чтобы найти пакет <somename> и установить его, если это возможно, -dev или -devel версию. Если -dev или -devel версия уже установлена, или её не сущечтвует, посмотрете на версию уже установленной. Она достаточно новая? Если она ниже, чем <someversion>, попробуйте обновить пакет. Если обновить пакет не представляется возможным, вы можете попробовать скомпилировать более мтарую версию программы. Более старые версии обычно используют более старые версии библиотек и программ, необходимых для компиляции.

Конфигурационный скрипт не может найти .h файл, необходимый для компиляции. Эта ошибка похожа на предыдущую, в которой необходимо установить -dev или -devel версию пакета. Однако, обычно не понятно какой пакет нужно установить для решения этой проблемы, так как <somename> может быть очень общим названием. Попробуйте поискать в интернетет <somename>.h, чтобы узнать в каком пакете этот файл находится, а затем установите этот пакет (и его -dev или -devel версия, если это возможно) с помощью менеджера пакетов вашего дистрибутива.

Вы используете для установки компилятор gcc, А переменная окружения CC отсутствует или не установлена. Убедитесь, что пакет gcc установлен, используя менеджер пакетов вашего дистрибутива. Если этот пакет не установлен, установите его. Если он установлен, попробуйте выполнить следующую команду:

Если это помогло, вы можете добавить эту команду в /etc/profile (это файл, содержащий команды, которые выполняются когда пользователь входит в систему) и тогда вам не придется набирать её снова.

Ваш пакет g++ отсутствует или поврежден. Используйте Используйте менеджер пакетов вашего дистрибутива (или любой другой способ найти и установить пакет), чтобы найти пакет g++ и установить его. Не забудьте, что в некоторых дистрибутивах этот пакет называется не g++. Fedora, например, использует название gcc-c++ в соем репозитарии yum. Если вы не можете найти g++, попробуйте поискать c++, cpp или gcc.

Эта ошибка вызвана странным "багом" в некоторых версиях библиотеки libtool, которая заставляет конфигурационный скрипт проверять все компиляторы поддерживающиеся libtool. Наиболее простое решение - установить g++.

Ошибки при выполнении команды make

Если вы компилируете программу с использованием gcc 4 (используйте gcc -dumpversion чтобы это выяснить), попробуйте использовать более старые версии компилятора. Сначала убедитесь, что у вас установлена более старая версия. Обычно это можно узнать, использовав следующую команду:

Если она вернет что-то вроде этого:

То можете использовать команды gcc32, чтобы скомпилировать программу в более ранними версиями gcc. Если команда не вернет подобной строки, то используя менеджер пакетов вашего дистрибутива, найдите и установите более ранние версии gcc (обычно они называются compat-gcc или gcc-<versionnumber>). После установки, вам должна быть доступна альтернативная версия gcc. Её можно найти используя команду ls. Заставить команды ./configure, make и make install использовать более старую версию gcc можно так:

]$ CC="/usr/bin/gcc32" ./configure
[rechosen@localhost

]$ CC="/usr/bin/gcc32" make
[rechosen@localhost

]$ CC="/usr/bin/gcc32" make install

Конечно путь /usr/bin/gcc32 надо заменить на тот, по которому у вас находится альтернативная версия gcc.

Иногда ошибки могут вызваны простым "багом" программы. Попробуйте скачать последнюю версию программы (используя её cvs, svn или другой репозитарий, или скачав последний снимок) и скомпилируйте её, возможно эта ошибка уже исправлена.

Ошибка при выполнении комадны make может быть также вызвана неправильной версией необходимой библиотеки или программы. Эта проблема часто встречается для очень новых или очень старых пакетов. Проверьте зависимости пакета (они обчно написаны на сайте программы) и сравните номера версий с версиями, установленными у вас на компьютере (их обчно можно посмотреть, используя менеджер пакетов вашего дистрибутива). Если номер версии в вашей системе больше того, которые написан на сайте, возможно вы пытаетесь скомпилировать очень старый пакет. Если вам дейсвительно необходимо его скомпилировать, попробуйте установить более старые версии зависимых пакетов.Как бы то небыло, обычно лучше поискать другой способ установки этого пакета или поискать альтернативу. Если номер версии в системе меньше, чем на сайте, вы можете попробовать обновить соответствующий пакет.Вы можетепопробовать обновить требуемую библиотеку или скомпилировать более старую весию программы.Так же проверьте, может уже есть этот пакет, скомпилированный для авшего дистрибутива. Его установка, обычно, проще, чем исправление ошибок компиляции.

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

Ошибки при выполнении команды make install

Эти ошибки обычно легко понять, но я все равно про них напишу. Есть два наиболее частых случая, почему команда make install возвращает ошибку:

У вас нет прав пользователя root. Попробуйте выполнить команду make install, используя команду sudo, или станеть пользователем root, используя команду su. Команда sudo применяется следующим образом:

]$ sudo make install

Она спросит пароль; обычно используется собственный пароль или пароль пользователя root. Вы можете испльзовать команду su, чтобы стать польpователем root:

Эта команда тоже спросит пароль, но в данном случае наобходим именно пароль пользователя root. После того, как вы стали пользователем root, просто выполните команду make install.

Пакет, который вы только что скомпилировали не имеет команды установки. В этом случае вам надо скопировать скомпилированный бинарный файл в директорию bin вручную. Если вы выполните команду ls в директории исходного кода, исполняемый файл должен быть светло зеленого цвета. Его надо скопировать в /usr/bin (или, если хотите, в /usr/local/bin) следующей командой:

]$ cp <executablefile> /usr/bin

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

Другие проблемы

Вот список некоторых других возможных проблем и их решения:

Все проходит хорошо, но когда я набираю имя программы, которую только что установил, bash говорить, что не может её найти. Это обычно происходит из-за того, что make install устанавливает все в /usr/local или in /opt/<packagename>. Посмотрите на вывод команды make install: куда скопированы файлы? Попробуйте добвавить эту директорию в переменную PATH (следующий пример приведен для пакета, установленного в /usr/local):

Вам надо заменить /usr/local/bin на директорию, в которой установлены исполняемые файлы вашего пакета. Если это помогло, добавьте эту строку в /etc/profile, чтобы вам не пришлось набирать её каждый раз. Кстати, вы можете контролировать место, куда установится пакет, указав следующую опцию, когда запускаете конфигурационный скрипт:

Измените /usr на директорию, в которую хотите установить пакет. Не забудьте, что вы устанавливаете только префикс; бинарные файлы установятся в свою поддиректорию, библиотеки в свою, заголовочные файлы в свою и т.д. Например при использовании указанного префикса, бинарные файлы будут установлены в /usr/bin.

Я хочу установить очень старую версию пакета, но я не могу найти исходный код в интернете. У вас еще остается маленький шанс. Попробуйте найти rpm файл пакета той версии, которую вы хотите и скачайте соответствующий src rpm файл. Распаковать его можно следующим образом:

]$ rpm2cpio <pmfile> | cpio -idv

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

Финальные слова

Это учебное пособие еще не закончено. Я планирую обновлять его, используя решения проблем, полученные от других пользователей. Поэтому я прошу вас комментировать эту статью и говорить, чтобы вы еще хотели увидеть в ней. Помните, что эта статья об основных ошибках. Не спрашивайте как скомпилировать определенную версию определенной программы. В любом случае, я надеюсь эта статья будет полезна для вас. Спасибо за прочтение и удачи в сложной, но увлекательной вещи, которая называется компиляция!

Я установил cygwin со всеми пакетами на Windows 7 64 бит. По какой-то причине команда make дает мне ошибку: bash make: команда не найдена. Я проверил и в моей папке bin нет make.исполняемый. Кто-нибудь может мне помочь? Мне действительно нужно работать в CYGWIN. Я не хочу идти в windows xp.

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

при установке (обновлении) проверьте "Devel" на "Install", он установит много МБ, но поможет. У меня нет времени проверять, что именно мне (нам) нужно.

CYGWIN INSTALL STEP

там перечислены, что именно необходимо.

выполните следующие действия:

  1. снова перейдите к установщику
  2. выполните начальную настройку.
  3. В разделе Библиотека-перейти к devel.
  4. под devel прокрутите и найдите make.
  5. установите всю библиотеку с именем make.
  6. нажмите кнопку Далее, потребуется некоторое время, чтобы установить.
  7. это решит проблему.

при выборе пакетов при установке или обновлении найдите "make" в searchbox и выберите поля, показывающие "make", а также "gcc", в основном найденные в пакете devel.

У меня была такая же проблема, и это было связано с несколькими установками cygwin.

Проверьте ссылку (значок), которую вы нажимаете, чтобы запустить терминал. Если он не указывает на каталог обновленной установки cygwin, у вас неправильная установка cygwin. При обновлении дважды проверьте местоположение cygwin и запустите именно этот экземпляр cygwin.

выполните следующие действия: 1. снова откройте Cygwin setup 2. выбрать категории на вкладке Вид 3. заполните вкладку" make " в поиске 4. расширить девел 5. найдите "make: a GNU version of the' make 'ultility", нажмите, чтобы установить 6. Готово!

Я столкнулся с той же проблемой. Выполните следующие действия:

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

Читайте также: