- Very strange issue of makefile, No such file or directory
- 1 Answer 1
- Not the answer you’re looking for? Browse other questions tagged linux makefile centos or ask your own question.
- Related
- Hot Network Questions
- Subscribe to RSS
- make error: No such file or directory
- 3 Answers 3
- Отладка Makefile /часть 2/
- Общие сообщения об ошибках
- Синтаксические ошибки
- missing separator
- commands commence before first target
- unterminated variable reference
- Ошибки в командных сценариях
- No Rule to Make Target
- Overriding Commands for Target
- Make: why do I get error saying «no such file or directory»
- 1 Answer 1
Very strange issue of makefile, No such file or directory
I came across a very strange issue of makefile, here it is: System: Linux CentOS 6 In the beginning, the name of makefile is “makefile”, its sample contents:
I got following err after I ran “make”: g++: file3.o: No such file or directory
I have a workaround to add a dummy file after file3:
This way I could build successfully.
And I know that I can delete all these lines:
let make to build using default settings, I could build successfully this way.
I also tried to just rename “makefile” to “Makefile”, and with following lines without dummy line:
To my surprise, I could build successfully this way.
Could anyone explain why I got error of “No such file or directory” for the last file3 in the beginning?
Following is the error output:
Following is the output after I added dummy line:
I tried to rename «makefile» to «Makefile» again, and it doesn’t work this time.
1 Answer 1
Ufffff!! Found your problem.
in your makefile a deamon came and introduced a TAB after the line file3.o : file3.cpp so make instead of taking implicit rule thought you are specifying explicit rule. For file1.o and file2.o it used implicit rule but for file3.o it assumed your are specifying explicit rule because of that TAB, but you had given it a blank TAB so file3.o was never built.
Now when you added dummy.o:dummy.cpp the TAB moved below that line so file3.o was compiled. When you were experimenting around you deleted that TAB that’s why renaming makefile to Makefile seemed to work.
Just FYI: there is no difference between Makefile or makefile both are treated equally by make, except when both Makefile and makefile files are there in same folder and you give make then makefile is executed instead of Makefile
Not the answer you’re looking for? Browse other questions tagged linux makefile centos or ask your own question.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.10.8.40416
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
make error: No such file or directory
I am new to kernel module development. So I started with simple hello world kernel module I am using «The Linux Kernel Module Programming Guide» book for the reference (it is addressing to kernel 2.6). I installed kernel-devel and kenel headers with yum. I am using fedora 17. I found that a symlink
Now, I have one hello-1.c (the simple kernel module and a Makefile in my working directory) The Makefile is:
when in $make i get error:
I make same program on Centos-5.x it run successfully , because the /lib/modules/3.3.4-5.fc17.x86_64/build was containing the actual module (not a symlink). What should be problem ? why such difference?
3 Answers 3
I have few doubts like, where your issuing the make command. Your current directory seems to be
whether your hello-1.c is in /root/kerneldev folder.
try «yum install kernel-devel»(for kernel headers)
Is telling you that the directory path after the *** does not exist. Make issues this exact format of error when the -C directory doesn’t exist. Other non-existent path situations will result in more words. For example, if the /lib/modules/3.3.4-5.fc17.x86_64/build directory does exist but it contains no makefile, make will specifically say no makefile found .
So the other answers are giving you ideas to help you create that directory with its proper contents.
And this answer is intended to also help people who have the above form of error message and for whom installing ‘kernel-devel’ will not help, by explaining the message itself.
Источник
Отладка Makefile /часть 2/
В этой части поговорим об общих методах и проблемах отладки. В конечном итоге, отладка — это солянка из всего, что работает в данной конкретной ситуации. Эти методы работают для меня и мне приходится полагаться на них даже в случае проблем с простейшими makefile. Может быть, они помогут и тебе тоже.
Один из очень раздражающих багов в 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 решит что это неправильно размещенная команда.
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 выдаст предупреждение переопределения.
Источник
Make: why do I get error saying «no such file or directory»
When I tried my makefile, I got error saying that No such file or directory, but my directory is right there, what do I do wrong? Thanks.
my project structure :
The error messages:
I guess it is about relative path, because I call this makefile from Install folder, then $(x) can’t be found from Install folder, but when I tried to make a folder named ev (Install/ev), I still got the same error.
I think it must be something basic I missed here, but what it is.
I am trying to build a project which includes several sub-projects. the structure is:
Inside of Install, I have a makefile, which is at the top level. The makefile in Install folder will call makefiles in other folders to build different subjects,
Ideally, I want to build every sub projects without touching sources. My sources include c++ and java code.
1 Answer 1
It’s not clear what you’re trying to do. Also due to some indentation hiccups I can’t be sure, but you appear to be defining a variable make-goal that contains a template for a make rule, then using it with $(call . ) inside the recipe for the all target. That cannot work: you cannot create a make rule inside the recipe for another make rule!
The reason this fails is that the $(call . ) is expanding to content which is added to the recipe of the all target, so instead of creating a new make rule it’s treating the result as a shell script. The first line is $1: , and you passed in ../ev , so make is trying to run the command ../ev: just as the error shows you.
If you describe what you want to do at a higher level we can give you some ideas on how to do it.
If you just want your all target to also build a subdirectory, there’s no need for all this complex GNU make advanced capabilities. That stuff is only needed when you get to guru-level makefile creation. Simple «build a target after another target is finished» is the exact thing make was designed to do: nothing special is needed to do that.
This is still a pretty non-standard setup but I think it will work the way you want. Remember you’ll have to either move the all target up to be the first one in the makefile, or you’ll have to run make all explicitly: make only builds the first target in the makefile unless you give it specific targets on the command line.
Источник