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

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


咨詢
建站咨詢
