先看makefile:這種需要在核心的makefile中新增arch 和 cross_compile
#ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個
#ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個
#kern_ver = 3.13.0-32-generic
#kern_dir = /usr#/src/linux-headers-3.13.0-32-generic,ubuntu的核心原始碼樹
kern_ver = $(shell uname -r)
kern_dir =
/lib/modules/$(kern_ver)
/build
開發板的linux核心的原始碼樹目錄
#kern_dir = /home/share/drivers/kernel
obj-m +
= module_test.o
all:
make -c $(kern_dir) m=`pwd` modules
cp: cp *
.ko /root/rootfs/rootfs/drivers -f
.phony: clean
clean:
make -c $(kern_dir) m=`pwd` modules clean
我們這裡看一種全新的,推薦的方式
kernel_dir=
/home/wyz/share/kernel_5.
10.10
/linux-
5.10
.10curdir=`pwd`
arch=arm
cross_compile=arm-linux-gnueabihf-
export arch cross_compile
obj-m :
= led.o
all:
make -c $(kernel_dir) m=$(curdir) modules
.phone:clean cp
clean:
$(make)
-c $(kernel_dir) m=$(curdir) clean
cp: sudo cp *
.ko /home/wyz/share/tool_server_dir/nfs -rf
我們一行一行的分析:
kern_ver = $(shell uname -r)
uname -r是linux的乙個命令,可以看到核心的版本號,例如我們在ubuntu14.04中輸入uname -r得到的是3.13.0-164-generic,這一行的意思是在makefile中使用shell命令uname -r得到3.13.0-164-generic,然後賦值給kern_ver 變數,
在makefile中變數的賦值兩邊是可以加上空格的,在shell中就不行。
kern_dir = /lib/modules/$(kern_ver)/build
結合第一行的命令,kern_dir = /lib/modules/3.13.0-164-generic/build
我們檢視一下build是乙個軟連線,指向:-> /usr/src/linux-headers-3.13.0-164-generic,但是/usr/src/linux-headers-3.13.0-164-generic又是/usr/src/linux-headers-3.13.0-164的軟連線。所以最終我們的ubuntu的核心原始碼樹就是:
/usr/src/linux-headers-3.13.0-164
obj-m += module_test.o,這一行就表示我們要將module_test.c檔案編譯成乙個模組。
如果是obj-y += module_test.o就表示我們要將module_test.c檔案靜態編譯鏈結進zimage中
make -c $(kern_dir) m=pwd
modules這個命令用來實際編譯模組,工作原理就是:利用make -c進入到我們指定的核心原始碼樹目錄下,然後在原始碼目錄樹下借用核心原始碼中定義的模組編譯規則去編譯這個模組完成編譯。-c (kd
ir)指
明跳轉到
核心原始碼
目錄下讀
取那裡的
make
file
;m
=(kdir) 指明跳轉到核心原始碼目錄下讀取那裡的makefile;m=
(kdir)
指明跳轉
到核心源
碼目錄下
讀取那裡
的mak
efil
e;m=
(pwd) 選項讓該makefile在構造modules目標之前返回到模組源**目錄並在當前目錄生成obj-m指定的***.o目標模組。make modules在核心中是編譯模組的意義。
總結一下就是:由於obj-m += module_test.o, make -c $(kern_dir) modules會進入到核心的原始碼樹目錄下,obj-m的值增加了module_test.o,然後make modules,就會生成module_test.ko驅動模組.。 m=pwd
其實是指定在構造modules目標之前返回到模組源**目錄並在當前目錄生成obj-m指定的***.o目標模組
make -c $(kern_dir) m=pwd
modules clean這個就是和make一樣的原理了。
通用Makefile詳解
我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多。c的源文 件。如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這 樣大大提高了開發效率。但是makefil...
linux 通用makefile編寫
一般當我們的工程檔案較多的時候,使用gcc工具直接敲編譯命令比較麻煩,所以寫makefile的好處就來了,每次只需要敲一下make就能編譯 這裡分享乙個萬能版的,當前目錄不管多少檔案,都只需要make一下,不用修改makefile,直接生成main可執行程式 以下是makefile 交叉編譯工具鏈 ...
通用的makefile寫法
1 定義可執行檔案的名稱 target mypro 2 指定此編譯工程所要使用的標頭檔案所在的目錄 inc i.iheader1 iheader2 3 指定cpp檔案所在的目錄 vpath src1 src2 4 指定所有的cpp檔案 src path foreachdir,subst vpath ...