& Ldquo; сделать & Rdquo; команда ничего не делает

Я новичок в Ubuntu и пытаюсь скомпилировать небольшую программу. У меня есть файл Makefile и raw1394.c в папке raw1394.

Когда я запускаю команду make, она должна создать файл raw1394.ko, но я ничего не получаю, когда запускаю команду make.

Я также пытался скомпилировать файл raw1394.c с помощью gcc, но он дает мне следующую ошибку.

raw1394.c:1:26: fatal error: linux/module.h: No such file or directory
compilation terminated

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

вот мой Makefie

obj-m += raw1394.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

и вот мой файл raw1394.c

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
printk(KERN_INFO "Loaded dummy raw1394 module\n");
return 0;
}
1
задан 14 August 2015 в 23:02

3 ответа

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

sudo apt-get install linux-headers-$(uname -r)

Обратите внимание, что версия вашего ядра передается с помощью команды uname -r.

0
ответ дан 14 August 2015 в 23:02

имя исходного файла - basic.c

#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);

сначала создайте файл для ubuntu

на своем терминале, чтобы uname -r затем вы получили версию .. который используется в вашей системе.

obj-m +=basic.o

KDIR =/usr/src/linux-headers-3.13.0-44-generic

all:
 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
 rm -rf *.o *.ko *.mod.* *.symvers *.order

Для запуска кода

$make
$ sudo insmode basic.ko
$ dmesg
u will get the output
$ sudo rmmod basic.ko
$ dmesg
0
ответ дан 14 August 2015 в 23:02

GCC выдает ошибку, потому что не может найти заголовочные файлы, которые вы включаете. Вы должны:

  1. проверить, не находится ли путь в папке raw1394.c, потому что тогда вам нужно использовать кавычки вместо <>: так #include "linux/module.h" (это может быть так, если вы не хотите использовать собственные файлы заголовков ядра)
  2. Проверьте ваш путь к компилятору, есть ли файл с именем linux с файлами заголовков в нем. Возможно, вам не хватает заголовков Linux.

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

CC=gcc
CFLAGS=-Wall -c

raw: raw1394.c
TAB $(CC) $(CFLAGS) raw1394/raw1394.c

all:
clean:
TAB rm -rf raw1394/*.o

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

Ввод make raw в правильном каталоге в командной строке автоматически выполнит target raw в Makefile.

0
ответ дан 14 August 2015 в 23:02

Другие вопросы по тегам:

Похожие вопросы: