2013-02-21 99 views
3

我需要關於內核模塊的Makefile的幫助。即使例子會有很大的幫助。具有多個子目錄的Linux內核模塊的Makefile

目前我的模塊代碼是在多個目錄下。讓我們說

<MAIN-DIR> --- l2.c 
    <SUB-DIR1> --- hello.c 
    <SUB-DIR2> --- bye.c 

對於上述情況,我該如何編碼我的生成文件。因爲建立l2模塊,我需要l2.o hello.o和bye.o.目前他們在多個目錄中。

回答

5

如果你正在構建一個模塊從內核樹的,像下面這樣一個簡單的makefile應該工作:

MODULE_NAME = mymodule 

SRC  := foo.c src/bar.c 

# Path to target Linux Kernel 
KDIR  := $(shell pwd) # <--- Fill in with path to kernel you're compiling against 

$(MODULE_NAME)-objs = $(SRC:.c=.o) 

obj-m  := $(MODULE_NAME).o 
PWD  := $(shell pwd) 

EXTRA_CFLAGS := -I$(PWD)/src -I$(PWD)/include 

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

如在SRC :=線可以看出,你簡單的指定所有的路徑您的源文件,包括子目錄中的文件。 KDIR中的頂級內核makefile將負責編譯。

關於內核構建系統和樹構建的更多信息可以在內核源文檔Documentation/kbuild/modules.txt中找到。

+0

感謝您的回覆,但似乎沒有爲我工作。問題是中的.c文件包含中的頭文件。因此,當我運行makefile時,它說它無法訪問使用「」 – codingfreak 2013-02-22 02:28:20

+1

包含的頭文件我已更新示例。您可以使用EXTRA_CFLAGS將其他標誌傳遞給編譯器,例如額外的包含目錄。在有一些東西,包括從的標題,但沒有指定目錄似乎有點奇怪。將include包括在一個目錄中並從那裏引用它們可能是正常的,可能在Makefile中使用'EXTRA_CFLAGS:= -I $(PWD)/ include'子句。 – 2013-02-22 02:48:13

+0

Hoo謝謝。還有一點疑問。我修改了內核以包含一個新函數並將其聲明爲EXPORT_SYMBOL。現在我從我的.c文件調用該函數。當我編譯時,我得到錯誤說隱式聲明..理想情況下,它應該被關注的鏈接時間權利而不是.o創建時間權利 – codingfreak 2013-02-22 03:49:16