Linux no rule to make target all что это

Что значит No rule to make target?

Пытаюсь собрать opencog. make в конце выдаёт:

[ 91%] Building CXX object opencog/embodiment/Control/OperationalAvatarController/CMakeFiles/OACTester.dir/OACTester.cc.o
make[2]: *** No rule to make target `/usr/lib/libluabind.so’, needed by `opencog/embodiment/Control/OperationalAvatarController/OACTester’. Stop.

cmake выдаёт вот что:

— Found Lua51: /usr/lib64/liblua-5.1.so;/usr/lib64/libm.so
— Looking for open in /usr/lib/libluabind.so
— Looking for open in /usr/lib/libluabind.so — not found
— Found Luabind library: /usr/lib/libluabind.so
— Found Luabind headers: /usr/include

Это что значит? Что не так с луабайндом?

ls -l /usr/lib/libluabind.so
readlink -e /usr/lib/libluabind.so

Ошибка в системе сборки этого вашего Cog. Исходный код рассчитан, что библиотека существует: /usr/lib/libluabind.so. Но, как вы внимательно заметили, она не установлена. В этом случае на этапе конфигурации должна была выскочить соответствующая ошибка или, возможно, сборка должны была быть опционально сконфигурирована с отключённой libluabind путём условной компиляции/линковки. Также возможно, что библиотека ошибочно ищется в /usr/lib, тогда как следует искать в /usr/lib64. В любом случае, это ошибка разработчиков.

1. Найти dev-пакет для libluabind или исправить CMake-скрипт.
2. Сообщить разработчикам об ошибке.

Спасибо, там правда пустой линк был.

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

Источник

Ошибка 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 невозможно определить, что именно вызвало проблему.

Читайте также:  Activate windows go to settings to activate windows как убрать

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

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

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

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

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

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

Источник

Make: *** Нет правила, чтобы сделать цель «все». Стоп. Ошибка Eclipse

Я только что загрузил комплект разработчика Eclipse CDT (87 МБ) для Windows. Я также установил MinGW и msys. Я также добавил это в PATH: C:\msys\1.0\bin; C:\mingw\bin. и после этого перезагрузился компьютер. Я проверил по типу «make -version» в cmd, и он работает.

Однако по какой-то причине я не могу скомпилировать мой проект C. Я не получаю двоичные файлы и получаю только следующие вещи в COnsole:

Может кто-нибудь мне поможет?

ОТВЕТЫ

Ответ 1

Для дальнейшего использования, если вы пытаетесь импортировать существующий проект с make файлом.

Это сообщение будет всплывать, если ваш make файл не имеет правила «все». При использовании опции «Создать файлы Makefile автоматически» следует позаботиться об этом автоматически. Если вам не нужны make файлы, сделанные для вас, у вас есть как минимум 3 простых варианта.

Вариант 1

Если вы не хотите использовать правило под этим именем, используйте решение twokats. Здесь уточнение.

  • Перейдите в Project Properties → C/С++ Build → вкладка Behavior.
  • Оставьте сборку (добавочную сборку).
  • Удалите «все» из текстового поля рядом с Build (Incremental Build).

Это позволяет Eclipse знать, что вы не пытаетесь использовать цель make, называемую «все». По какой-то причине это по умолчанию.

Вариант 2

Используйте что-то похожее на make файл Etiennebr. Обратите внимание: строка all: $(TARGET) — это правило, в котором Eclipse жалуется, что не может найти.

Вариант 3

Замените «все» на имя правила по вашему выбору и обязательно включите это правило в свой файл.

Ответ 2

Как раз для вашей справки, есть способ настроить параметры сборки CDT. У меня было это же сообщение об ошибке (хотя у я была есть цель make — просто не названа «все» ) и нашел это решение (для Galileo + CDT):

Щелкните правой кнопкой мыши свой проект и выберите Свойства. Появится диалоговое окно «Свойства», и вы увидите опцию C/С++ Build, где вы можете установить определенные параметры сборки. Выделите этот элемент и отобразится страница «Свойства». Выберите конфигурацию, которую вы хотите изменить, а затем в следующем разделе вы увидите две вкладки: Настройки Builder и Поведение. Это вкладка Поведение, которую вы хотите. В этом разделе вы можете установить настройки для параметров сборки и настроек рабочего места, включая указание целевого имени (по умолчанию — «все» ) или отключение автоматических сборок.

Это было невероятно полезно для меня, когда я начал использовать CDT. Мой исходный код отделен от области сборки, и до тех пор, пока я не настроюсь, никаких make файлов не существует. Когда я настроен, мое целевое имя по умолчанию явно «по умолчанию», а не «все» . Было очень неприятно, что Eclipse сообщал об ошибке в моем проекте, прежде чем я что-то сделал. Настройка среды в соответствии с моей разработкой породила чудеса. НТН.

Ответ 3

щелкните правой кнопкой мыши проект Properties- > C/С++ Build, в «Настройках Builder» установите флажок «Генерировать файлы автоматически», а затем выберите «Тип строителя» для «Внутренний строитель», а затем нажмите «ОК», проблема была решена!

Ответ 4

Я потратил много времени на эту ошибку и теперь понял, что те проекты, которые не скомпилированы, были созданы до того, как я установил MinGW и msys, поэтому раньше не было makefile. И не было папки include со ссылкой на make файл. Это причина, по которой я не мог ее скомпилировать. Теперь, когда я создаю новый проект, это прекрасно.

Однако, интересно, есть ли способ добавить путь к makefile для предыдущих проектов?

Ответ 5

Вы должны взглянуть на свой файл makefile (или создать его, если отсутствует). Это файл make default:

Источник

Отладка Makefile /часть 2/

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

Читайте также:  Зарезервированная память mac os catalina

Один из очень раздражающих багов в make 3.80 был в сообщении об ошибке в makefile, где make указывал номер строки, и обычно этот номер строки был неверный. Я не удосужился исследовать из-за чего эта проблема возникает: из-за импортируемых файлов, присваиваний многострочных переменных или из-за пользовательских макросов. Обычно, make дает номер строки больше чем должен был бы. В сложных makefile бывает что номер не совпадает на 20 строк.

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

Для того чтобы использовать её, нужно перечислить имена переменных которые надо распечатать в командной строке и собрать debug цель:

Если уж совсем делать всё волшебно, то можно использовать MAKECMDGOALS переменную, чтобы избежать присвоения переменной V :

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

В то время как make выводит команды из сценариев цели до их выполнения, он не выводит команды выполняющиеся в shell функции. Часто эти команды сложные и неуловимые в том плане, что могут выполняться как незамедлительно, так и в отложенной манере, если они были вызваны в значении рекурсивной переменной. Один из способов увидеть эти команды — включить отладку в самой оболочке:

Если это запустить с опцией отладки sh , мы увидим:

Можно заметить, что также выводятся значения всех переменных и выражений.

Часто встречаются сильно вложенные выражения, например, для оперирования с именами файлов:

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

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

Общие сообщения об ошибках

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

Сообщение make об ошибке имеет стандартный формат:

где makefile строка — это имя файла или импортированного файла в котором произошла ошибка. Следующая часть — номер строки, в которой произошла ошибка, далее следуют три звездочки, и, наконец, само сообщение.

Заметим, что это задача make запускать другие программы и таким образом, если при этом возникают ошибки, скорее всего проблемы в твоём makefile вызвали ошибки в этих других программах. Для примера, ошибки оболочки могут быть из-за плохо сформированных командных сценариев, или ошибок компилятора из-за некорректных аргументов командной строки. Выяснение того, какая программа выдала сообщение об ошибке — первоочередная задача при решении проблемы. К счастью, сообщения make довольно очевидны.

Синтаксические ошибки

Обычно это типографические ошибки: пропущенные скобки, пробелы после запятых в параметрах функции, и так далее.

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

Скорее всего, make развернёт переменную $S в ничего, и оболочка выполнит цикл только раз со значением OURCES в f . В зависимости от того, что ты собрался делать с f , можно получить забавные сообщения оболочки:

но можно и не получить сообщения вовсе. Помни — имена переменных обрамляются скобками.

missing separator

или (в GNU make — пер.):

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

commands commence before first target

Эта ошибка появляется в основном в середине makefile, когда строка вне командного сценария начинается с отступа (пробелы или символ табуляции). make сделает все возможное, чтобы устранить неоднозначность этой ситуации, но если строка не может быть идентифицирована как присваивание значения, условное выражение или многострочное определение макроса, make решит что это неправильно размещенная команда.

Читайте также:  Как поднять http сервер linux

unterminated variable reference

Это простая, но распространённая ошибка. Она означает, что ты забыл закрыть имя переменной или вызов функции правильным количеством скобок. С сильно вложенными вызовами функций и именами переменных make файлы становятся похожими на Lisp! Избежать этого поможет хороший редактор, который умеет сопоставлять скобки, такой как Emacs.

Ошибки в командных сценариях

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

Мы обсуждали пропущенные точки с запятыми в разделе «лучшие практики», поэтому не будем на этом останавливаться здесь.

выводится, когда оболочка не смогла найти команду foo . Так, оболочка поискала в каждой папке из переменной PATH исполняемый файл и не нашла совпадений. Чтобы исправить такую ошибку, нужно обновить PATH переменную, обычно в .profile (Bourne shell), .bashrc (bash) или .cshrc (C shell). Конечно, можно также установить PATH в самом makefile, и экспортировать PATH из make .

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

Здесь touch команда не сработала, что напечатало своё собственное сообщение объясняющее сбой. Следующая строка — это итоговая ошибка make . Упавшая цель в makefile указана в квадратных скобках, а затем статус выхода упавшей программы. Если программа вышла по сигналу, а не с ненулевым статусом выхода, то make напечатает более подробное сообщение.

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

В обоих случаях ошибка происходит из программ запускаемых make , нежели от самого make .

No Rule to Make Target

Это сообщение имеет две формы:

Это означает, что make решил обновить файл XXX, но make не смог найти ни одного правила для выполнения работы. make ищет во всех явных и неявных правилах в его базе данных прежде чем сдаться и вывести это сообщение.

Есть три причины для этой ошибки:

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

Файл должен быть, но make не находит его или из-за того, что его нет, или make не знает где его искать. Конечно, иногда make абсолютно прав. Файла нет — похоже мы забыли его скачать из VCS . Еще чаще, make не может найти файл из-за того, что исходник расположен где-то еще. Иногда исходник в другом дереве исходников, или может файл генерируется другой программой и создался в папке артефактов сборки.

Overriding Commands for Target

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

Также он может вывести сообщение:

Первое предупреждение показывает строку, на которой был найден второй сценарий команд; тогда как второе предупреждение указывает на позицию исходного переопределённого командного сценария.

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

Например, мы могли бы определить общную цель во включаемом файле:

и позволим нескольким отдельным makefile добавить свои собственные требования. Мы могли бы записать в makefile:

Если непреднамеренно добавить командный сценарий в такой makefile, make выдаст предупреждение переопределения.

Источник

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