1. 程式人生 > >linux驅動學習(二) Makefile高階

linux驅動學習(二) Makefile高階

在我前一篇寫的【 linux驅動學習(一)Makefile基礎】中,Makefile寫的中規中矩,其實Makefile寫法很靈活,可以寫得很簡潔,而且減少出錯的可能,現在就把之前寫的Makefile改進一下。

main: main.o hello.o word.o
	gcc main.o hello.o word.o -o main

main.o:main.h hello.h word.h
hello.o:hello.h
word.o:word.h

clean:
	echo "cleanning project"
	-rm main *.o
	echo "clean completed"

.PHONY:clean

這是不是比以前簡單多了,但是main.o hello.o word.o這三個目標的編譯命令都沒有,怎麼會編譯呢,執行make試試看
<localhost.localdomain:/data/ghostyu/linuxc> make
cc    -c -o main.o main.c
cc    -c -o hello.o hello.c
cc    -c -o word.o word.c
gcc main.o hello.o word.o -o main
<localhost.localdomain:/data/ghostyu/linuxc>
cc是什麼呢,執行下which cc
<localhost.localdomain:/data/ghostyu/linuxc> which cc
/usr/bin/cc
事實上cc指向的也是gcc

其實,這是Makefile的內建隱含規則,然後make時,呼叫這些隱含規則。

# default
OUTPUT_OPTION = -o [email protected]

# default
CC = cc

# default
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

%.o: %.c
#  commands to execute (built-in):
        $(COMPILE.c) $(OUTPUT_OPTION) $<
以上是內建規則中關於隱含規則的部分

‘#’為註釋符,跟‘//’一樣

‘CC’為Makefile變數

'[email protected]'與‘$<’為特殊變數,'[email protected]'的取值為規則的目標,‘$<’取值為規則的第一個條件。

%.o: %.c是一種特殊的規則,稱為模式規則(Pattern Rule)。
CFLAG CPPFLAG TARGET_ARCH未定義,展開為空,

現在來分析一下,隱含規則是怎樣解析Makefile的。

首先,OUTPUT_OPTION是一個變數,

OUTPUT_OPTION = -o [email protected]
這邊變數展開為:“-o main.o”

其次,展開COMPILE變數

# default
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
為:“cc    -c”。中間有四個空格。

然後

%.o: %.c
這就相當於 main.o:main.c

最後

        $(COMPILE.c) $(OUTPUT_OPTION) $<
注意開頭的空白為tab鍵,8個字元,這是Makefile規定的,gcc命令等必須tab開頭識別

展開為:

        cc    -c -o main.o main.c
完整的:
main.o:main.h hello.h word.h
main.o:main.c
        cc    -c -o main.o main.c

這就隱含的包含了各個條件的編譯

注意:上面之所以可以寫成兩行,是應為條件並不是一定要寫在一行,可以分開寫,但只能存在一條命令:

比如下列:

main.o: main.c main.h hello.h word.h
	gcc -c main.c
可以寫成:
main.o:main.h hello.h word.h
main.o:main.c
	gcc -c main.c

寫規則的目的是讓make建立依賴關係圖,不管怎麼寫,只要把所有的依賴關係都描述清楚了就行。

相關推薦

linux驅動學習 Makefile高階

在我前一篇寫的【 linux驅動學習(一)Makefile基礎】中,Makefile寫的中規中矩,其實Makefile寫法很靈活,可以寫得很簡潔,而且減少出錯的可能,現在就把之前寫的Makefile改進一下。 main: main.o hello.o word.o gcc main.o hello.o

Linux 網卡驅動學習網絡驅動接口小結

-a key 頻率 網絡 上網 ren 網絡設備 ews 入口 【摘要】前文我們分析了一個虛擬硬件的網絡驅動樣例。從中我們看到了網絡設備的一些接口。事實上網絡設備驅動和塊設備驅動的功能比較相似,都是發送和接收數據包(數據請求)。當然它們實際是有非常多不同

Linux 網絡卡驅動學習網路驅動介面小結

【摘要】前文我們分析了一個虛擬硬體的網路驅動例子,從中我們看到了網路裝置的一些介面,其實網路裝置驅動和塊裝置驅動的功能比較類似,都是傳送和接收資料包(資料請求)。當然它們實際是有很多不同的。 1、引言 首先塊裝置在/dev目錄下有裝置節點,而網路裝置沒有

Linux核心驅動學習----根檔案系統的構成 (root filesystem)

1、建立根檔案系統目錄和檔案 1.1建立目錄 1.2建立裝置檔案(命令mknod);必須建立裝置檔案---consle\null 1.3建立配置檔案---複製已有的/etc目錄下的檔案

linux入門學習linux圖形化界面與命令行界面之間的切換,以及一些系統命令

之間 linu 鏡像 pan ctr 安裝 linux -- linux鏡像 一、linux圖形化界面與命令行界面之間的切換 註意:前提是你安裝的 linux鏡像ios 必須具備圖形化功能。 1)  圖形化界面--->命令行界面:       ctrl + alt +

linux驅動學習 i2c驅動架構史上最全 davinc dm368 i2c驅動分析

預備知識 在閱讀本文最好先熟悉一種i2c裝置的驅動程式,並且瀏覽一下i2c-core.c以及晶片提供商的提供的i2c匯流排驅動(i2c-davinci.c)。標題黨請見諒! 其實i2c介面非常的簡單,即使用51單片的gpio來模擬i2c,編寫一個e2prom或者其他i2c介

Linux 網卡驅動學習應用層、tcp 層、ip 層、設備層和驅動層作用解析

local acc 每次 letter auto sizeof style article inode 本文將介紹網絡連接建立的過程、收發包流程,以及當中應用層、tcp層、ip層、設備層和驅動層各層發揮的作用。 1、應用層 對於使用socket進行網絡連接的serv

Linux學習之內核、系統調用、庫

all mic linu windows系統 文件 .dll 執行 lin win   這篇博客主要介紹Linux中幾個常見的概念      Kernal:內核:我們知道計算機的硬件包括:cpu、內存、外存等等 系統想要統一資源分配就需要用到內核!內核是將計算機的硬件資源抽

linux學習——湯哥的推薦書籍

最終 對比 2.6 win 程序開發 經驗 專業 linux 操作 面試題目 成為一名精通 Linux程序設計的高級程序員一直是不少朋友孜孜以求的目標。 根據中華英才網統計數據,北京地區 Linux 程序員月薪平均為 Windows程序員的 1.8 倍、Java 程序員

linux學習linux配置網卡以及常見網絡問題排查

library ifconf netmask logs 切換網絡 peer local 但是 src 實驗環境環境:mac,vmware fusion 一、常用的虛擬機網絡連接模式。 NAT:推薦方式。它可以使你在切換網絡環境(比如在工作中和家裏)時,不需要修改虛擬主機的配

Linux學習

強制退出 linux學習 刪除用戶 usermod 修改 方向 終端 方法 用戶鎖定 前言:接著上一篇Linux學習(一) 1.用戶,組和權限2.文本處理工具3.vim文本編輯器4.shell腳本編程基礎 一,用戶,組和權限 1.用戶 1.管理員:root,0 普通用戶:

Linux文件系統學習之重要數據結構1

class targe html evel 系統結構 會有 集合 spec lan 轉載自:https://blog.csdn.net/wudongxu/article/details/6436894 《Linux內核設計與實現》 http://www.ibm.com/

linux菜鳥基礎學習 上篇

com lower mar 刪除 .com [] 根目錄 col test 一.linux系統結構 首先我們學習linux的系統結構,linux系統中一切皆文件! 由上圖,可以看到linux是一個倒樹結構linux中所有的東西都是文件這些文件都在系統頂級目錄“/” /就是

linux菜鳥基礎學習 中篇

文件中 rec 動作 mission 退出vim 第一個 51cto delet 關鍵字搜索 一.man的使用 man ->>manual ###man是手冊縮寫man man #####查看man命令的幫助man passwd

linux菜鳥基礎學習 下篇

顯示名稱 保存 數字 sudoer linux 刪除用戶 arr 組的建立 51cto 1.用戶理解 用戶就是系統使用者的身份在系統中用戶存儲為若幹竄字符+若幹個系統配置文件用戶信息涉及到的系統配置文件:/etc/passwd ###用戶信息用戶:密碼:uid:gi

UNIX環境高階程式設計的學習

UNIX系統程序控制程式說明 該程式從標準輸入讀取命令,然後執行這些命令,程式涉及到的函式主要用法包括: fgets的用法 execlp的用法 waitpid的用法 程式如下: #include "apue.h" #include <sys/wai

Makefile學習----生成靜態庫檔案

Lunix下編譯靜態庫檔案: .o字尾檔案:編譯生成的中間程式碼檔案; .a字尾檔案:靜態庫檔案,編譯的時候會合到可執行程式中,檔案比較大; .so字尾檔案:動態庫檔案,只是一個指向,不會合到可執行程式中,當要呼叫函式庫的時候才使用;   用一個簡單的例子闡述下在lunix環境下生成靜態庫

鳥哥的linux私房菜學習

鳥哥的linux私房菜學習(二) 使用ll和ls檢視自己的目錄資料 使用ls可以單純的列出目錄名,不過這並沒有顯示這個檔名相關的各項許可權資料 包括時間、容量等等。這個時候就需要使用ll(LL的小寫)   使用ll -a檢視隱藏檔案 如果想知道家目錄(~所在的目錄即為家目錄)下有沒

Linux USB 驅動開發—— USB 驅動幾個重要資料結構

Linux USB 驅動開發(二)—— USB 驅動幾個重要資料結構          前面我們學習了USB 驅動的一個描述符,下面來學習 USB 驅動的幾個重要資料結構   一、struct usb_interface&n

Linux 字元裝置驅動結構—— 自動建立裝置節點

      上一篇我們介紹到建立裝置檔案的方法,利用cat /proc/devices檢視申請到的裝置名,裝置號。 第一種是使用mknod手工建立:mknod filename type major minor 第二種是自動建立裝置節點:利用u