2013-10-13 104 views
2

我寫了一個簡單的Linux模塊&其make文件化妝:沒有規則,使目標

這是我的模塊

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

MODULE_LICENSE("Dual BSD/GPL"); 

static int hello_init(void) { 
    printk("<1> Hello world!\n"); 
    return 0; 
} 

static void hello_exit(void) { 
    printk("<1> Bye, cruel world\n"); 
} 

module_init(hello_init); 
module_exit(hello_exit); 

這是我的make文件

obj-m :=Hello.o 


KDIR = /usr/src/linux-headers-3.5.0-17 

all: 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 

clean: 
    rm -rf *.o *.ko *.mod.* *.symvers *.order 

當我執行make -f MakeFile 它給出以下o/p

make -C /usr/src/linux-headers-3.5.0-17 SUBDIRS=/home/linux/Desktop modules 
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17' 

    WARNING: Symbol version dump /usr/src/linux-headers-3.5.0-17/Module.symvers 
      is missing; modules will have no dependencies and modversions. 

scripts/Makefile.build:44: /home/linux/Desktop/Makefile: No such file or directory 
make[2]: *** No rule to make target `/home/linux/Desktop/Makefile'. Stop. 
make[1]: *** [_module_/home/linux/Desktop] Error 2 
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17' 
make: *** [all] Error 2 

任何人都可以告訴我如何擺脫這些錯誤。 在此先感謝

+0

爲什麼需要將'SUBDIR'設置爲'$ PWD'?你有文件'/ home/linux/Desktop/Makefile'嗎?根據我的經驗,不需要設置'SUBDIR'。您可以嘗試刪除'all:'中的'SUBDIR'並重新制作。 – starrify

+0

感謝刪除subdir後的重播apper make [1]:***沒有指定目標,也沒有找到makefile。停止。 –

+0

哦,對不起,我粗心的回覆。我想你應該做的是恢復'SUBDIR'並將'MakeFile'重命名爲'Makefile',然後重試,因爲它缺少'Makefile'文件並且'* nix'區分大小寫。 – starrify

回答

2

請在Makefile下面的變化,其內核鍵入uname -a

然後到CD/usr/src目錄/

運行,然後檢查

首先檢查你的Linux的源代碼名稱

爲如

UNAME -a Linux的維奈 - VirtualBox虛擬3.2.0-50 - 仿製PAE# 76-Ubuntu SMP星期二七月9日19:24:55 UTC 2013 i686 i686 i386 GNU/Linux

這裏它的源代碼名稱是linux-headers-3.2.0-50-generic-pae 你的情況也是一樣 如

Linux的頭-3.2.0-23 Linux的頭-3.2.0-23-仿製PAE 所以使用的linux-headers-3.2.0-23-generic-pae代替 Linux的頭-3.2.0-23如更換同在Makefile

即KDIR =/usr/src目錄/ Linux的頭-3.5.0-17泛型-PAE

或奧德R鍵避免上述問題用
KDIR == /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd) 
KDIR == /lib/modules/$(shell uname -r)/build 

$(MAKE) -C $(KDIR) M=$(PWD) modules 
+0

Nope dude,'$ PWD'是shell中的一個環境變量,其內容與'pwd'的結果完全相同。 – starrify

+0

也確保你的Makefile名稱是正確的,因爲starrify表示 –

+1

也同樣在這裏引用http://stackoverflow.com/questions/19223653/linux-makefile-example/19224677#19224677 –

0
obj-m += xyz.o 

KDIR:=/usr/src/linux-headers-3.5.0-46-generic 

all: 

     make -C $(KDIR) M=$(PWD) modules 

clean: 

     make -C $(KDIR) M=$(PWD) clean 

確定/usr/src/包含Linux的頭-3.5.0-46-通用文件? 如果不是這樣,請下載:

sudo apt-get install linux-headers-3.5.0-46 

sudo apt-get install linux-headers-3.5.0-46-generic