Ошибка make не такого файла каталога

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

/lib/modules/3.3.4-5.fc17.x86_64/build -> /usr/src/kernels/3.3.4-5.fc17.x86_64

Now, I have one hello-1.c (the simple kernel module and a Makefile in my working directory)
The Makefile is:

obj-m += hello-1.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

when in $make i get error:

make -C /lib/modules/3.3.4-5.fc17.x86_64/build M=/root/kerneldev modules
make: *** /lib/modules/3.3.4-5.fc17.x86_64/build: No such file or directory.  Stop.
make: *** [all] Error 2

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?

asked Jan 30, 2013 at 12:36

Nikhil Rupanawar's user avatar

Nikhil RupanawarNikhil Rupanawar

4,03110 gold badges34 silver badges51 bronze badges

1

The message

make: *** /lib/modules/3.3.4-5.fc17.x86_64/build: No such file or directory.  Stop.

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.

answered Feb 20, 2020 at 18:46

cardiff space man's user avatar

I have few doubts like, where your issuing the make command.
Your current directory seems to be

M=/root/kerneldev

whether your hello-1.c is in /root/kerneldev folder.

answered Jan 30, 2013 at 19:25

kzs's user avatar

kzskzs

1,7733 gold badges24 silver badges44 bronze badges

try «yum install kernel-devel»(for kernel headers)

answered Jul 16, 2013 at 9:50

subaash's user avatar

I have a Makefile that defines a .PHONY clean target for cleaning up .o files and executables, that target looks like:

...
.PHONY : clean
clean:
    rm $(addprefix $(vq_DIR),$(vq_OBJS)) 
       $(addprefix $(vq_DIR),vq) 
       $(addprefix $(covq_DIR),$(covq_OBJS)) 
       $(addprefix $(covq_DIR),covq) 
       $(addprefix $(covq_2_DIR),$(covq_2_OBJS)) 
       $(addprefix $(covq_2_DIR),covq_2) 
       $(addprefix $(covq_2_DIR),$(test_OBJS)) 
       $(addprefix $(covq_2_DIR),test)

Everything works as it should, but when some of these files do not exist, rm raises an Error (No such file or directory), and the output says that the Makefile target failed, when it clearly did what I wanted.

Is there a good way to basically tell the rm command to «remove these files if they exist, and don’t complain if they don’t»? I looked up the manpage for rm, and found no such flag.

Edit: I actually didn’t notice the description of the -f flag in the manpage, this is the solution.


0

1

При выполнении команды make выдаёт это:
make[1]: *** /lib/modules/5.4.209-1-MANJARO/build: Нет такого файла или каталога. Останов.
У меня manjaro на cinnamon. В начале пытался исправить это установкой headers под ядро, но ничего не изменилось. Ядро кстати 5.4, т.к. более новые не корректно работают с драйверами видяхи (поэтому совету по типу «ядро по новее поставь и норм будет» сразу отметаются).
Что делать? Варианты есть?

РЕШЕНИЕ:
Я просто установил под своё ядро linux-headers и после перезагрузки все встало на свои места.

DetL0k писал(а): ↑

05.01.2017 00:14

Если сборку делать в корне проекта (там же где и Makefile), то все нормально.

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

Код: Выделить всё

all                 : $(OPATH)/jd
$(OPATH)/jd         : $(OPATH)/core.o $(OPATH)/jd_opts.o
    $(CC) $(CFLAGS) $^
$(OPATH)/core.o     : core.c
    $(CC) $(CFLAGS) -c $<
$(OPATH)/jd_opts.o  : jd_opts.c
    $(CC) $(CFLAGS) -c $<

либо добавить Makefile в каталог build (но тогда в нём надо будет указывать путь к исходным файлам). То и другое сказывается на читаемости не лучшим образом.

Ещё попридираюсь к мелочам. Вот эта строчка

смысла не имеет, так как переменная $(CC) по умолчанию и так имеет именно это значение.
Здесь

много лишнего. -Iinclude — опция препроцессора, и место ей в переменной $(CPPFLAGS), а опция -o никогда в $(CFLAGS) не включается, и указывается непосредственно в рецепте. Дело в том, что переменная CFLAGS часто переопределяется сборщиками, и в Вашем случае это сломает сборку. В принципе может переопределяться и CPPFLAGS, поэтому с ней лучше поступить так:

— тогда обязательная опция не потеряется в любом случае.
Ну а если $(CPPFLAGS) и $(CFLAGS) (а также $(LDFLAGS), если она нужна) определены корректно, можно вообще не заморачиваться написанием рецептов, а использовать те, которые захардкожены в make. Тогда весь Makefile станет намного проще:

Код: Выделить всё

CFLAGS              = -Wall -g
CPPFLAGS            += -Iinclude
VPATH               = src

all                 : jd
jd                  : core.o jd_opts.o
clean               :
    rm -f jd core.o jd_opts.o

.PHONY              : all clean

#c #makefile

#c #makefile

Вопрос:

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

 IDIR =../include

CXX=g  

CXXFLAGS=-I$(IDIR)

LDIR =../lib

LIBS=-lm

_DEPS = person.h

DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

OBJ = main/main.o ../modules/person.o  

$(ODIR)/%.o: %.c $(DEPS)

    $(CXX) -c -o $@

lt; $(CXXFLAGS)

run: $(OBJ)

$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)

.PHONY: clean

clean:

rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~

Но проблема в том, что терминал выводит следующее сообщение:

 g   -I./include   -c -o main/main.o modules/main.cpp
main/main.cpp:6:10: fatal error: person.h: No such file or directory
    6 | #include <person.h>
      |          ^~~~~~~~~~
compilation terminated.
make: *** [<builtin>: main/main.o] Error 1
 

Моя папка, в которой person.h находится at ../include , но по какой-то причине мой компилятор не находит ее. Я использую Linux, а не Windows.
Если я использую команду: $cpp -I../include/ -v so, чтобы узнать, есть ли проблема с поиском моей папки, но в выводе указано следующее:

 Using built-in specs.
COLLECT_GCC=cpp
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c  ,go,brig,d,fortran,objc,obj-c  ,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 
COLLECT_GCC_OPTIONS='-E' '-I' '../include/' '-v' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/9/cc1 -E -quiet -v -I ../include/ -imultiarch x86_64-linux-gnu - -mtune=generic -march=x86-64 -fasynchronous-unwind-tables -fstack-protector-strong -Wformat Wformat-security -fstack-clash-protection -fcf-protection
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-
gnu/include"
ignoring nonexistent directory "../include/"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/9/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
 

В котором говорится , что игнорируется несуществующий каталог "../include/" . Я считаю, что это проблема, но я не могу найти решение своей проблемы.

Заранее благодарю.

(Если я помещу весь путь от пользователя к включению, у меня будет та же проблема)

РЕДАКТИРОВАТЬ: я создал файл для своего основного и поместил свой main.cpp там и изменил CXXLAGS на CXXFLAGS, увидев мои ошибки в комментариях и ответе.

EDIT2: По какой-то причине это сработало, когда я переименовал папку, в которую были включены мои файлы.

Комментарии:

1. Простой способ создать блок кода — ввести « нажмите enter вставить код нажмите enter в конце кода и снова введите « и нажмите enter. Я отредактировал добавление « до и после Makefile.

2. @drescherjm Это меня не подвело. Спасибо

3. Возможно, он жаловался, что у вас слишком много кода по сравнению с текстом. Я не знаю. Я задал только один вопрос, но ответил почти на 200.

4. Вы не говорите, что ODIR установлено, но я предполагаю, что оно установлено ../modules .

5. Обычно мы называем это CXXFLAGS » нет CXXLAGS » .

Ответ №1:

Проблема в этом:

 OBJ = main.o ../modules/person.o  

$(ODIR)/%.o: %.c $(DEPS)
        $(CXX) -c -o $@

lt; $(CXXLAGS)

Итак, это правило шаблона сообщает make, как создать файл, соответствующий шаблону ../modules/%.o , и добавляет CXXLAGS переменную в строку компиляции.

Но вы не предоставили правило для построения main.o , которое не соответствует этому шаблону, потому что его нет ../modules/... . Поскольку вы не указали свое собственное правило, make использует встроенное правило, но это правило не знает о созданной вами переменной CXXLAGS , поэтому оно не добавляет -I параметр в строку компиляции.

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

Если вы действительно хотели поместить main.o в ../modules каталог, то с помощью:

 OBJ = ../modules/main.o ../modules/person.o  
 

заставит его работать.

Если вы действительно хотите main.o появиться в том же каталоге, вам нужно определить правило для его создания там. Вы можете использовать встроенное правило make, чтобы сделать это за вас, но для этого вам нужно использовать встроенные переменные make для управления им: вы используете CXXLAGS , но стандартная встроенная переменная для компиляции C есть CXXFLAGS . Если вы измените все свои способы использования, если CXXLAGS хотите CXXFLAGS , то это сработает.

Или вы можете создать свое собственное шаблонное правило (или явное правило) для сборки main.o без использования встроенного правила make.

Комментарии:

1. Я использовал то, что вы сказали, но и теперь это показывает, когда я компилирую -I (g -I./include -c -o main/main.o modules/main.cpp ) но это все равно не работает.

2. Под «не работает» вы имеете в виду, выдает ту же ошибку о person.h том, что его там нет? Ну, в каталоге, в котором вы запускаете make run ls ../include/person.h … что там говорится? Если он говорит, что файл не найден, то где НАХОДИТСЯ файл person.h ?

3. Мой включаемый файл был правильным. Я только что переименовал его снова с тем же файлом, и теперь он работает. Спасибо за помощь

Понравилась статья? Поделить с друзьями:
  • Ошибка mac операции на терминале
  • Ошибка make sure you can write to current directory
  • Ошибка mac на терминале что это
  • Ошибка mainwin32 в прототип 2
  • Ошибка mac на терминале как исправить