2013-10-07 74 views
1

您好我是新手到Linux和我通過一個例子 http://www.linuxforu.com/2010/12/writing-your-first-linux-driver/ 我使用Ubuntu 12.04和創建了一個叫做ofd.c C代碼文件工作我的方式(見下文),並保存在一個我在〜/ Development/MyProgs/myHelloWorldLinuxModule/v2創建的目錄。我也創建了一個Makefile(參見下面),它位於同一個目錄中。
我希望看到當我輸入做出相同的目錄下生成一個.ko文件,但我得到的是一個消息,說「爲默認將做什麼」Linux的makefile文件例子

我真的不明白makefile文件

我應該定義KERNELRELEASE地方,

什麼是默認的行實際上這樣做,這是否意味着開展做出內核目錄和工作目錄或者我應該把我的代碼的地方尤其如此。

有沒有usr/src/linux but a /usr/src/linux-headers-3.8.0-29,所以我改變了這一點,是正確的。 (雖然似乎沒有任何區別,但)。

任何幫助將不勝感激。

代碼:

/* ofd.c – Our First Driver code */ 
#include <linux/module.h> 
#include <linux/version.h> 
#include <linux/kernel.h> 

static int __init ofd_init(void) /* Constructor */ 
{ 
    printk(KERN_INFO "Namaskar: ofd registered"); 
    return 0; 
} 

static void __exit ofd_exit(void) /* Destructor */ 
{ 
    printk(KERN_INFO "Alvida: ofd unregistered"); 
} 

module_init(ofd_init); 
module_exit(ofd_exit); 

MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>"); 
MODULE_DESCRIPTION("Our First Driver");` 

Makefile中......

# Makefile – makefile of our first driver 

# if KERNELRELEASE is defined, we've been invoked from the 
# kernel build system and can use its language. 
ifneq (${KERNELRELEASE},) 
    obj-m := ofd.o 
# Otherwise we were called directly from the command line. 
# Invoke the kernel build system. 
else 
    KERNEL_SOURCE := /usr/src/linux 
    PWD := $(shell pwd) 
default: 
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules 

clean: 
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean 
endif 

回答

0

您的Makefile中的錯誤。

必須在定義針對目標的動作的行上使用製表符,例如,行:

default: 
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules 

必須具有從線到${MAKE}的開始的標籤。您需要強制使用製表符,否則您目擊的錯誤將會發生。

Make語法對此要求非常特別,它很容易出錯。如果您使用了像vim這樣的編輯器,它通常會向紅色突出顯示的用戶顯示空格字符,以便他們能夠理解錯誤出現在那裏。

0

您沒有顯示您運行得到此錯誤的make命令。但是,這樣的錯誤通常意味着您的目錄中有一個名爲default的文件或子目錄。 Make想要構建目標,並且makefile中的第一個目標是default。它沒有定義的先決條件,這意味着如果它存在,則認爲它是最新的,並且不需要做任何事情來構建它(它存在,並且不依賴於其他任何東西)。

你應該使用這樣的:

.PHONY: default clean 

申報defaultclean目標是 「假的」;這表明即使這些目標已經存在,它仍然應該始終運行與它們相關的配方。

1

的錯誤是由於naming convention your makefile is not able to find source code 其核心是通過鍵入uname -a

運行首先檢查然後去cd /usr/src/

然後檢查你的Linux源代碼名稱

爲如

uname -a Linux vinay-VirtualBox 3.2.0-50-generic-pae #76-Ubuntu SMP Tue Jul 9 19:24:55 UTC 2013 i686 i686 i386 GNU/Linux

這裏它的源代碼名稱是linux-headers-3.2.0-50-generic-pae

因此,在你的Makefile u需要給予正確的名稱是這樣

KERNEL_SOURCE := /usr/src/linux-headers-3.2.0-50-generic-pae

爲了避免上述問題試試這個Makefile

# If KERNELRELEASE is defined, we've been invoked from the 
# kernel build system and can use its language. 
ifneq ($(KERNELRELEASE),) 
    obj-m := ofd.o 
# Otherwise we were called directly from the command 
# line; invoke the kernel build system. 
else 
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
    PWD := $(shell pwd) 
default: 
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 
endif 

這裏UNAME -a做出決議問題

0

錯誤是由於原因,Makefile中指定的標題或內核源代碼,因爲標籤KERNEL_SOURCE無法找到您已經提到您懷疑的標頭。將/usr/src/linux-headers-3.8.0-29改爲/ usr/src/linux,而不是改變路徑。

將Makefile中給出的路徑更改爲您的源代碼的內核的實際版本,或者如果您運行的是相同的內核,則可以通過uname命令獲取版本。

更好的方法可能是:

default: 
    $(MAKE) -C /usr/src/$(shell uname -r)/ M=$(shell pwd) modules