新聞中心
在Linux操作系統(tǒng)中,驅(qū)動是實(shí)現(xiàn)硬件與操作系統(tǒng)交互的基礎(chǔ)。為開發(fā)和維護(hù)Linux驅(qū)動程序,需要掌握一定的驅(qū)動編譯技能。其中,makefile是自動化構(gòu)建代碼的關(guān)鍵。本文將介紹的過程,希望能對初學(xué)者有所幫助。

創(chuàng)新互聯(lián)專注于西華企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站開發(fā)。西華網(wǎng)站建設(shè)公司,為西華等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
一、了解makefile
makefile是一個腳本文件,它告訴make命令需要如何編譯和鏈接源代碼,最終生成可執(zhí)行文件。makefile的格式是“目標(biāo):依賴文件”,然后是構(gòu)建該目標(biāo)的命令。依賴文件可以是源代碼文件、頭文件或其他目標(biāo)文件。
在Linux模塊驅(qū)動編譯過程中,makefile通常包括以下幾個部分:
1.頭文件的定義
2.模塊編譯參數(shù)的定義
3.模塊源代碼、頭文件和目標(biāo)文件的定義
4.需要鏈接的庫文件的定義
5.模塊編譯規(guī)則的定義
6.生成可執(zhí)行文件的定義
7.清除冗余文件的定義
二、編寫makefile
了解了makefile的基本概念后,接下來就可以編寫Linux模塊驅(qū)動的makefile了。下面以加載一個簡單的字符設(shè)備驅(qū)動程序?yàn)槔?/p>
1.頭文件的定義
在makefile中,需要定義頭文件的路徑??梢允褂米兞縼肀苊庵貜?fù)輸入。
“`c
HEADFILES:= /usr/include/linux/
“`
2.模塊編譯參數(shù)的定義
模塊參數(shù)是指在驅(qū)動程序啟動時需要傳遞給模塊的信息。可以在makefile中定義這些參數(shù)。例如,可以定義一個BUILD參數(shù),用于區(qū)分debug和release版本的構(gòu)建。
“`c
BUILD=release
“`
3.模塊源代碼、頭文件和目標(biāo)文件的定義
通過變量來指定要編譯的源文件、頭文件和目標(biāo)文件。
“`c
SOURCE=hello.c
OBJECT=hello.o
# 頭文件路徑已在上面定義
“`
4.需要鏈接的庫文件的定義
如果在編譯過程中需要鏈接庫文件,則需要在makefile中定義這些庫文件。例如,如果需要連接庫文件libpthread.so,則可以使用以下語句:
“`c
LIBS=-lpthread
“`
5.模塊編譯規(guī)則的定義
在makefile中,需要定義編譯規(guī)則。例如,下面是一個簡單的編譯規(guī)則:
“`c
$(OBJECT): $(SOURCE)
gcc -c $
“`
這個規(guī)則指定了一個目標(biāo)(OBJECT)和一個依賴文件(SOURCE)。它告訴make命令,如果$(SOURCE)被修改,需要使用gcc編譯$(SOURCE)文件,并將其輸出到$(OBJECT)中。
6.生成可執(zhí)行文件的定義
在makefile中,也要定義如何生成可執(zhí)行文件。例如,可以使用以下語句:
“`c
hello.ko: $(OBJECT)
gcc $(OBJECT) -o hello.ko $(LIBS)
“`
這個規(guī)則指定了一個目標(biāo)(hello.ko)和一個依賴文件($(OBJECT))。它告訴make命令,如果$(OBJECT)被修改,需要使用gcc把$(OBJECT)文件與$(LIBS)鏈接,并將其輸出到hello.ko中。
7.清除冗余文件的定義
在makefile中,也需要定義清除冗余文件的規(guī)則。例如,下面是一個簡單的清除規(guī)則:
“`c
clean:
rm -f $(OBJECT) hello.ko
“`
這個規(guī)則指定了一個目標(biāo)(clean),它告訴make命令刪除$(OBJECT)和hello.ko文件。
三、編譯Linux驅(qū)動
有了makefile文件后,就可以使用make命令編譯Linux驅(qū)動程序。
1.編譯
使用make命令編譯Linux驅(qū)動程序。
“`c
make
“`
2.清除
使用make命令清除之前生成的文件。
“`c
make clean
“`
四、
寫一個makefile可能看起來很困難,但是實(shí)際上非常簡單。在開始編寫之前,需要了解一些基本的語法。有了makefile文件后,就可以輕松編譯和鏈接Linux驅(qū)動程序。為了保持makefile的簡潔和易讀性,可以使用變量來避免冗余代碼。如果需要在編譯過程中使用庫文件,可以在makefile中進(jìn)行定義。希望本文能對的初學(xué)者有所幫助。
相關(guān)問題拓展閱讀:
- 我想請教你關(guān)于Linux編譯驅(qū)動模塊的問題,該怎么修改makefile?請幫忙。我一直在線的。
- Linux平臺Makefile文件的編寫基礎(chǔ)篇
我想請教你關(guān)于Linux編譯驅(qū)動模塊的問題,該怎么修改makefile?請幫忙。我一直在線的。
內(nèi)核自帶的驅(qū)動模塊?還是自己寫的?
直接文本編輯啊
Linux平臺Makefile文件的編寫基礎(chǔ)篇
目的:
基本掌握了 make 的用法,能在Linux系統(tǒng)上編程。
環(huán)境:
Linux系統(tǒng),或者有一臺Linux服務(wù)器,通過終端連接。一句話:有Linux編譯環(huán)境。
準(zhǔn)備:
準(zhǔn)備三個文件:file1.c, file2.c, file2.h
file1.c:
#include
#include “file2.h”
int main()
{
printf(“print file1$$$$$$$$$$$$ “);
File2Print();
return 0;
}
file2.h:
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern “C” {
#endif
void File2Print();
#ifdef __cplusplus
}
#endif
#endif
file2.c:
#include “file2.h”
void File2Print()
{
printf(“Print file2********************** “);
}
基礎(chǔ):
先來個例子:
有這么個Makefile文件。(文件和Makefile在同一目錄)
=== makefile 開始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結(jié)束 ===
一個 makefile 主要含有一系列的規(guī)則,如下絕棗:
A: B
(tab)
(tab)
每個命令行前都必須有tab符號。
上面的makefile文件目的就是要編譯一個helloworld的可執(zhí)行文件。讓我們一句一句來解釋:
helloworld : file1.o file2.o: helloworld依賴file1.o file2.o兩個目標(biāo)文件。
gcc File1.o File2.o -o helloworld: 編譯出helloworld可執(zhí)行文件。-o表示你指定 的目標(biāo)文件名。
file1.o : file1.c: file1.o依賴file1.c文件。
gcc -c file1.c -o file1.o: 編譯出file1.o文件。-c表示gcc 只把給它的文件編譯成目標(biāo)文件, 用源碼慧梁文件的文件名命名但把其后綴由“.c”或“.cc”變成“.o”。在這句中,可以省略-o file1.o,編譯器默認(rèn)生成file1.o文件,這就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
這兩句和上兩句相同。
clean:
rm -rf *.o helloworld
當(dāng)用戶鍵入make clean命令時,會并碧拆刪除*.o 和helloworld文件。
如果要編譯cpp文件,只要把gcc改成g++就行了。
寫好Makefile文件,在命令行中直接鍵入make命令,就會執(zhí)行Makefile中的內(nèi)容了。
到這步我想你能編一個Helloworld程序了。
上一層樓:使用變量
上面提到一句,如果要編譯cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻煩了。
第二個例子:
=== makefile 開始 ===
OB = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g
helloworld : $(OB)
$(CC) $(OB) -o helloworld
file1.o : file1.c file2.h
$(CC) $(CFLAGS) -c file1.c -o file1.o
file2.o : file2.c file2.h
$(CC) $(CFLAGS) -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結(jié)束 ===
這里我們應(yīng)用到了變量。要設(shè)定一個變量,你只要在一行的開始寫下這個變量的名字,后 面跟一個 = 號,后面跟你要設(shè)定的這個變量的值。以后你要引用 這個變量,寫一個 $ 符號,后面是圍在括號里的變量名。
CFLAGS = -Wall -O –g,解釋一下。這是配置編譯器設(shè)置,并把它賦值給CFFLAGS變量。
-Wall: 輸出所有的警告信息。
-O: 在編譯時進(jìn)行優(yōu)化。
-g: 表示編譯debug版本。
這樣寫的Makefile文件比較簡單,但很容易就會發(fā)現(xiàn)缺點(diǎn),那就是要列出所有的c文件。如果你添加一個c文件,那就需要修改Makefile文件,這在項(xiàng)目開發(fā)中還是比較麻煩的。
再上一層樓:使用函數(shù)
學(xué)到這里,你也許會說,這就好像編程序嗎?有變量,也有函數(shù)。其實(shí)這就是編程序,只不過用的語言不同而已。
第三個例子:
=== makefile 開始 ===
CC = gcc
XX = g++
CFLAGS = -Wall -O –g
TARGET = ./helloworld
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o
SOURCES = $(wildcard *.c *.cpp)
OB = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OB)
$(XX) $(OB) -o $(TARGET)
chmod a+x $(TARGET)
clean:
rm -rf *.o helloworld
=== makefile 結(jié)束 ===
函數(shù)1:wildcard
產(chǎn)生一個所有以 ‘.c’ 結(jié)尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示產(chǎn)生一個所有以 .c,.cpp結(jié)尾的文件的列表,然后存入變量 SOURCES 里。
函數(shù)2:patsubst
匹配替換,有三個參數(shù)。之一個是一個需要匹配的式樣,第二個表示用什么來替換它,第三個是一個需要被處理的由空格分隔的列表。
OB = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符變成.o,形成一個新的文件列表,然后存入OB變量中。
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o
這幾句命令表示把所有的.c,.cpp編譯成.o文件。
這里有三個比較有用的內(nèi)部變量。 擴(kuò)展成當(dāng)前規(guī)則的目的文件名, lt; 擴(kuò)展成依靠 列表中的之一個依靠文件,而 $^ 擴(kuò)展成整個依靠的列表(除掉了里面所有重 復(fù)的文件名)。
linux 驅(qū)動編譯 makefile的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 驅(qū)動編譯 makefile,學(xué)習(xí)Linux驅(qū)動編譯makefile,我想請教你關(guān)于Linux編譯驅(qū)動模塊的問題,該怎么修改makefile?請幫忙。我一直在線的。,Linux平臺Makefile文件的編寫基礎(chǔ)篇的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計(jì)、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計(jì)和制作領(lǐng)域具有豐富的經(jīng)驗(yàn)。
網(wǎng)頁標(biāo)題:學(xué)習(xí)Linux驅(qū)動編譯makefile(linux驅(qū)動編譯makefile)
URL標(biāo)題:http://m.fisionsoft.com.cn/article/copojpd.html


咨詢
建站咨詢
