Я новичок в 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;
}
По всей вероятности, вам не хватает заголовков Linux для вашего ядра (файлы .h, которые вы включаете в первые строки вашей программы). Эти файлы различны для каждой версии ядра, но они удобно упакованы для вас в репозитории. Попробуйте установить его следующим образом:
sudo apt-get install linux-headers-$(uname -r)
Обратите внимание, что версия вашего ядра передается с помощью команды uname -r
.
имя исходного файла - 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);
на своем терминале, чтобы 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
GCC выдает ошибку, потому что не может найти заголовочные файлы, которые вы включаете. Вы должны:
raw1394.c
, потому что тогда вам нужно использовать кавычки вместо <>
: так #include "linux/module.h"
(это может быть так, если вы не хотите использовать собственные файлы заголовков ядра) 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.