1. 程式人生 > >Linux下Makefile快速編寫入門

Linux下Makefile快速編寫入門

(一)為什麼要編寫Makefile

 我們自己平常在linux下編譯原始檔時,當然可以使用gcc -Wall -g main.c -o main這樣的命令一個一個編譯,但是一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,我們一個個編譯是極其花費時間的,也是不可取的。

makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。

makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為 makefile就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。

(二)Makefile的基本規則
 Mackfile基本規則
Target ...: Dependencies ...
Command ...
說明:
1)目標(TARGET):即最終想要產生的檔案,如:可執行檔案,目標檔案或中間檔案等;目標也可以是要執行的動作,如clean,也稱為偽目標(用.PHONY指定偽目標)。
2)依賴(DEPENDENCIES):為了產生目標檔案而依賴的檔案列表,一個目標通常依賴於多個檔案。
3)命令(COMMAND):是make執行的動作(shell命令或是可在shell下執行的程式,如echo)。注意:每個命令列的起始字元必須為TAB字元!
如果DEPENDENCIES中有一個或多個檔案更新的話,COMMAND就要執行,這就是Makefile最核心的內容。
(三)簡單Makefile的編寫
1.單級目錄下的Makefile編寫

    我們只需要使用vi Makefile命令建立一個新的Makefile檔案,等我們編寫好後,只需要使用make 命令就可執行編譯操作。這裡我們建立兩個.c檔案,使用他們生成目標檔案:

  1. .PHONY:clean  
  2. OBJECTS=01.o 02.o  
  3. main:$(OBJECTS)  
  4.     gcc -Wall -g $^ -o [email protected]  
  5. 01.o:01.c  
  6.     gcc -Wall -g -c $< -o [email protected]  
  7. 02.o:02.c  
  8.     gcc -Wall -g -c $< -o [email protected]
      
  9. clean:  
  10.     rm -f main $(OBJECTS)  
上面是相對簡練的寫法,我們一個個來解釋:
1.使用變數來代替01.o 02.o ,方便後文使用。
2.使用自動化變數簡化一些操作
[email protected] 規則的目標檔名
$< 規則的第一個依賴檔名
$^ 規則的所有依賴檔案列表
3.使用make clean 命令即可執行刪除操作
2.多級(二級)目錄生成可執行檔案的Makefile的編寫
01 02 資料夾下分別有01.c 02.c ,並且和資料夾同級目錄的有03.c,main是由這三個.c檔案共同生成的,如何編寫?

  1. .PHONY:clean all  
  2. CC=gcc  
  3. CFLAGS=-Wall -g  
  4. BIN=main  
  5. SUBDIR=$(shell ls -d */)          
  6. ROOTSRC=$(wildcard *.c)  
  7. SUBSRC=$(shell find $(SUBDIR) -name '*.c')  
  8. SUBOBJ=$(SUBSRC:%.c=%.o)  
  9. $(BIN):$(ROOTOBJ) $(SUBOBJ)  
  10.     $(CC) $(CFLAGS) $(ROOTOBJ) $(SUBOBJ) -o $(BIN)  
  11. .c.o:  
  12.     $(CC) $(CFLAGS) -c $< -o [email protected]  
  13. clean:  
  14.     rm -f *.o $(BIN) $(ROOTOBJ) $(SUBOBJ)  
1.SUBDIR=$(shell ls -d */) 使用shell命令,將當前目錄下所有的子目錄賦給SUBDIR
2.ROOTSRC=$(wildcard *.c) ROOTSRC代表當前目錄下符合匹配模式的所有檔案
3.SUBOBJ=$(SUBSRC:%.c=%.o) 生成.c對應的.o檔案
以上就是這三個內嵌函式的使用方式。
3.多級(二級)目錄下生成多個可執行檔案
緊接上例,01檔案下生成01可執行檔案,02資料夾下生成02可執行檔案,要求使用Makefile一個make命令完成。
這就需要我們在每個資料夾下編寫自己的Makefile檔案,最後使用資料夾目錄的Makefile完成操作。

  1. 01資料夾下的Makefile  
  2. CC  =gcc  
  3. BIN =01  
  4. OBJS =01.o  
  5. .PHONY: all clean print  
  6. all:print $(BIN)  
  7. print:  
  8.     @echo "----make all in $(PWD)-----"
  9. #$(BIN):$(OBJS)
  10. #   $(CC) $(OBJS) -o [email protected]
  11. %.o:%.c  
  12.     $(CC) -c $<  
  13. clean:  
  14.     @echo "----make clean in $(PWD)---"
  15.     rm -f $(BIN) $(OBJS)  
  1. 02資料夾下的Makefile  
  2. (這裡02資料夾下為.cpp檔案)  
  3. CXX =g++  
  4. BIN =02  
  5. OBJS =02.o  
  6. CPPFLAGS =-Wall -g  
  7. .PHONY: all clean print  
  8. all:print $(BIN)  
  9. print:  
  10.     @echo "-----make all in $(PWD)----"
  11. $(BIN):$(OBJS)  
  12.     $(CXX) $(CPPFLAGS) $(OBJS) -o [email protected]  
  13. %.o:%.cpp  
  14.     $(CXX) -c $<  
  15. clean:  
  16.     @echo "----make clean in $(PWD)----"
  17.     rm -f $(BIN) $(OBJS)  
  1. 資料夾同級目錄下的Makefile檔案  
  2. SUBDIRS =01 02  
  3. .PHONY:default all clean $(SUBDIRS)  
  4. default:all  
  5. all clean:  
  6.     $(MAKE) $(SUBDIRS) [email protected]  
  7. $(SUBDIRS):  
  8.     $(MAKE) -C [email protected] $(TARGET)  

上面兩個很好理解,最後的這個Makefile檔案中,$(MAKE)代表make命令,TARGET預設是第一個即all$(MAKE) -C(大寫)代表進入到01 02Makefile中,執行引數為TARGET的操作。


當我們執行make clean時,TARGET即為clean


更深入的內容請參考:http://blog.csdn.net/haoel/article/details/2886/

相關推薦

LinuxMakefile快速編寫入門

(一)為什麼要編寫Makefile 我們自己平常在linux下編譯原始檔時,當然可以使用gcc -Wall -g main.c -o main這樣的命令一個一個編譯,但是一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,我們一個個編譯是極其花費時間的,也是

LinuxMakefile編寫及四個特殊符號的意義@、[email protected]、$^、$

我們先看三段C++程式: 一、line1的原始碼 line1.h #ifndef _LINE_1_H #define _LINE_1_H void line1_print(const char *strMsg); #endif line1.cpp #includ

Linux目錄快速切換小工具bd

bd假設現在所處的目錄路徑為:/tmp/ab/bc/cd/de/ef/fg/ab/zz/xx/yy,如何快速切換到ef目錄?通常使用cd命令進行目錄切換,比較繁瑣,此時可以使用bd工具一、安裝bd:# wget --no-check-certificate -O /usr/bin/bd https://raw

Linuxmakefile學習

文本文 新規 兩個 組成 https 當前 自動更新 mman n) [make是什麽?]   make是一個命令工具,是一個解釋makefile中指令的命令工具。它可以簡化編譯過程裏面所下達的指令,當執行 make 時,make 會在當前的目錄下搜尋 Makefile (

Linux使用QT編寫和呼叫動態連結庫(.so檔案)

Linux下Qt建立和呼叫共享庫檔案.so 費了點功夫,總算get了編寫共享庫(Shared Library,Windows下稱為“動態連結庫”,即Dynamic Link Library)和呼叫的這個新技能! 動態連結庫的好處是不言而喻的,一個稍微複雜一點的程式,頂層設計的時候良好

Linuxmakefile編寫

昨天把程式移植到linux改了bug以後,感覺好麻煩 每次編譯都要輸那麼長一堆命令,容易輸錯,而且沒有變的原始碼也順便重新編譯了一次,很浪費時間。 當時用了別名,發現不能實現需求。 嗯,學一學makefile怎麼寫 基本語法 target : prerequisites <ta

LinuxMakefile的automake生成全攻略

作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。          在本文中,將給大家介紹如

Python MySQLdb在Linux快速安裝

1.最快速最簡單方法(趕時間的話) 可能遇到問題: 原因:之前使用編譯的方法進行安裝,下的是1.2.3,但是用yum目前最高1.2.1,衝突 解決方法:刪除已經編譯的檔案 再進行 無錯誤,則表示成功了 2.自己編譯安裝 需要: A.gcc B.setuptools

LinuxMakefile檔案常用知識總結

1.Makefile檔案命令的使用 一般有兩種用法 #1 make #2 make command 第一種用法會自動執行Makefile中的所有指令,第二種用法會執行Makefile中的指定指令。 2.Makefile檔案命令的一般寫法 目標: 依賴項1 依賴項2

[轉]linuxMakefile的automake生成全攻略

2006-07-19 作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Make

linux用C編寫ftp客戶端

這是一個大作業,要求能夠模擬ftp協議,實現一個ftp客戶端,然後要求能夠實現相應的功能,主要是能夠實現ls,pwd,cwd(cd),put和get功能。然後是在被動模式下來實現這些功能。那麼首先我們需要對ftp協議有一個具體的瞭解,然後才能夠自己實現這個功能。 FTP

LinuxMakefile指令碼

Linux下Makefile指令碼 Linux下Makefile指令碼 程式碼示例 功能說明 原文地址: http://beself.top/2018/12/28/linux下makefile指令碼/ Linu

Linux使用eclipse編寫Java程式體驗

在Linux下使用eclipse編寫Java程式體驗 今天實在是無聊然後呢就在Linux下使用eclipse寫了一個Java自動售貨機的程式後來,突然發現其實呢在Linux如果是用eclipse那麼感覺就失去了很多的樂趣,可能也就只有我覺得百分之百的純手寫程式碼,是一種樂趣吧 !

linux用C編寫的基於smtp的帶附件郵件傳送程式

         今天做了一個簡單的stmp郵件傳送的客戶端demo,可以支援帶附件傳送,希望將實現分享一下, 目前測試環境是公司的內部郵箱,  有gmail郵箱測試沒有成功, 可能gmail郵箱需要ssl加密,後續再進行完善吧, 這個demo實現的非常簡單的阻塞的傳送傳送

[轉貼]LinuxMakefile的automake生成全攻略[-]

  作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。   在本文中,將給大家介紹如何使用 a

linux對qt編寫的程序進行部署

gcc line oca 12px 完成 可執行 document uil bzip 當我們完成程序設計之後,需要將可執行程序交付客戶,而運行環境裏面可能是沒有相關支持庫的,這個時候就涉及到部署的相關問題。對於我們在Linux下基於QT編寫的圖像處理程序,我們采用lin

LinuxMakefile的自動生成步驟

一、 Makefile 介紹               Makefile 是用於自動編譯和連結的 ,一個工程有很多檔案組成 ,每一個檔案的改變都會導致工程的重新連結 ,但是不是         所有的檔案都需要重新編譯 ,Makefile 中紀錄有檔案的資訊 ,在 mak

linux 使用expect編寫shell 指令碼互動訪問遠端伺服器

使用命令列登陸遠端伺服器一般需要ip地址以及登陸密碼等,每次都手動輸很不方便,expect可以滿足自動輸入密碼。下面是詳細的介紹: 首先安裝expect: 我用的是ubuntu14.04,使用sudo apt-get install expect即

linux用vim編寫C/C++單個源程式的基本方法

在Linux下可以用於程式設計的工具實在是太多了,我比較喜歡的是Kdevelop,今天又學了下在終端直接用vim編寫簡單C/C++程式的方法。這樣貌似更方便些。 一、在終端直接用vim編寫C程式 在某路徑下開啟一個終端,或開啟終端後進入你想存放原始檔的路徑,然後 [[em

Linuxnorflash驅動編寫方法

                                                                      Linux下norflash驅動編寫步驟 1. 分配map_info結構體 2. 設定: 物理基地址(phys), 大小(size),