comando “make” não está fazendo nada

1

Eu sou novo no Ubuntu e estou tentando compilar um pequeno programa. Eu tenho um arquivo Makefile e raw1394.c em uma pasta raw1394.

quando executo um comando make, ele deve produzir o arquivo raw1394.ko, mas não recebo nada quando executo o comando make.

Eu também tentei compilar o arquivo raw1394.c com o gcc, mas ele está me dando o seguinte erro.

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

você poderia me orientar como posso resolver esse problema?

aqui é meu 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

e aqui está o meu arquivo raw1394.c

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

int init_module(void)
{
printk(KERN_INFO "Loaded dummy raw1394 module\n");
return 0;
}
    
por nabeel 15.11.2013 / 10:01

3 respostas

1

O GCC fornece o erro porque não consegue encontrar o (s) arquivo (s) de cabeçalho que você inclui. Você deveria:

  1. verifique se o caminho não está na pasta raw1394.c , porque você precisa usar aspas em vez de <> : so #include "linux/module.h" (pode ser o caso se você não quiser usar o próprio kernel arquivos de cabeçalho)
  2. Verifique o caminho do seu compilador se existe um arquivo chamado linux com os arquivos de cabeçalho nele. Você provavelmente está perdendo os cabeçalhos do Linux.

Em segundo lugar, os makefiles são usados para automatizar o processo de compilação (pois isso geralmente envolve várias instruções e / ou instruções diferentes para destinos diferentes). Mas você ainda precisará dos comandos gcc corretos em seu makefile. Então, o makefile (básico) deve ficar assim (muitas extensões e flexibilidade podem ser adicionadas a ele, leia mais sobre makefiles se você quiser fazer isso):

CC=gcc
CFLAGS=-Wall -c

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

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

Observe que intenções específicas são usadas em Makefiles. Portanto, coloquei TAB no código onde deveria haver uma tabulação (vários espaços NÃO funcionarão).

Digitar make raw no diretório correto na linha de comando executará automaticamente o alvo bruto no Makefile.

    
por bverhagen 15.11.2013 / 10:39
3

nome do arquivo de origem é 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);

faça o arquivo para o ubuntu

no primeiro tipo no terminal ur que uname -r então você vai ter a versão .. que está usando no sistema ur.

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

Para executar o código

$make
$ sudo insmode basic.ko
$ dmesg
u will get the output
$ sudo rmmod basic.ko
$ dmesg
    
por Sudip Das 04.03.2015 / 21:18
2

Com toda a probabilidade você está perdendo os cabeçalhos do Linux para o seu kernel (os arquivos .h que você inclui nas primeiras linhas do seu programa). Esses arquivos são diferentes para cada versão do kernel, mas são convenientemente empacotados para você nos repositórios. Tente instalar da seguinte maneira:

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

Note que sua versão do kernel está sendo passada através do comando uname -r .

    
por Luís de Sousa 15.11.2013 / 10:45