Linux下Makefile快速編寫入門
(一)為什麼要編寫Makefile
我們自己平常在linux下編譯原始檔時,當然可以使用gcc -Wall -g main.c -o main這樣的命令一個一個編譯,但是一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,我們一個個編譯是極其花費時間的,也是不可取的。
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。
makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為 makefile就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。
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檔案,使用他們生成目標檔案:
- .PHONY:clean
- OBJECTS=01.o 02.o
- main:$(OBJECTS)
- gcc -Wall -g $^ -o [email protected]
- 01.o:01.c
- gcc -Wall -g -c $< -o [email protected]
- 02.o:02.c
- gcc -Wall -g -c $< -o [email protected]
- clean:
- 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檔案共同生成的,如何編寫?
- .PHONY:clean all
- CC=gcc
- CFLAGS=-Wall -g
- BIN=main
- SUBDIR=$(shell ls -d */)
- ROOTSRC=$(wildcard *.c)
- SUBSRC=$(shell find $(SUBDIR) -name '*.c')
- SUBOBJ=$(SUBSRC:%.c=%.o)
- $(BIN):$(ROOTOBJ) $(SUBOBJ)
- $(CC) $(CFLAGS) $(ROOTOBJ) $(SUBOBJ) -o $(BIN)
- .c.o:
- $(CC) $(CFLAGS) -c $< -o [email protected]
- clean:
- rm -f *.o $(BIN) $(ROOTOBJ) $(SUBOBJ)
2.ROOTSRC=$(wildcard *.c) ROOTSRC代表當前目錄下符合匹配模式的所有檔案
3.SUBOBJ=$(SUBSRC:%.c=%.o) 生成.c對應的.o檔案
以上就是這三個內嵌函式的使用方式。
3.多級(二級)目錄下生成多個可執行檔案
緊接上例,01檔案下生成01可執行檔案,02資料夾下生成02可執行檔案,要求使用Makefile一個make命令完成。
這就需要我們在每個資料夾下編寫自己的Makefile檔案,最後使用資料夾目錄的Makefile完成操作。
- 01資料夾下的Makefile
- CC =gcc
- BIN =01
- OBJS =01.o
- .PHONY: all clean print
- all:print $(BIN)
- print:
- @echo "----make all in $(PWD)-----"
- #$(BIN):$(OBJS)
- # $(CC) $(OBJS) -o [email protected]
- %.o:%.c
- $(CC) -c $<
- clean:
- @echo "----make clean in $(PWD)---"
- rm -f $(BIN) $(OBJS)
- 02資料夾下的Makefile
- (這裡02資料夾下為.cpp檔案)
- CXX =g++
- BIN =02
- OBJS =02.o
- CPPFLAGS =-Wall -g
- .PHONY: all clean print
- all:print $(BIN)
- print:
- @echo "-----make all in $(PWD)----"
- $(BIN):$(OBJS)
- $(CXX) $(CPPFLAGS) $(OBJS) -o [email protected]
- %.o:%.cpp
- $(CXX) -c $<
- clean:
- @echo "----make clean in $(PWD)----"
- rm -f $(BIN) $(OBJS)
- 資料夾同級目錄下的Makefile檔案
- SUBDIRS =01 02
- .PHONY:default all clean $(SUBDIRS)
- default:all
- all clean:
- $(MAKE) $(SUBDIRS) [email protected]
- $(SUBDIRS):
- $(MAKE) -C [email protected] $(TARGET)
上面兩個很好理解,最後的這個Makefile檔案中,$(MAKE)代表make命令,TARGET預設是第一個即all,$(MAKE) -C(大寫)代表進入到01 02的Makefile中,執行引數為TARGET的操作。
當我們執行make clean時,TARGET即為clean
更深入的內容請參考:http://blog.csdn.net/haoel/article/details/2886/
相關推薦
Linux下Makefile快速編寫入門
(一)為什麼要編寫Makefile 我們自己平常在linux下編譯原始檔時,當然可以使用gcc -Wall -g main.c -o main這樣的命令一個一個編譯,但是一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,我們一個個編譯是極其花費時間的,也是
Linux下Makefile的編寫及四個特殊符號的意義@、[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
Linux下makefile學習
文本文 新規 兩個 組成 https 當前 自動更新 mman n) [make是什麽?] make是一個命令工具,是一個解釋makefile中指令的命令工具。它可以簡化編譯過程裏面所下達的指令,當執行 make 時,make 會在當前的目錄下搜尋 Makefile (
Linux下使用QT編寫和呼叫動態連結庫(.so檔案)
Linux下Qt建立和呼叫共享庫檔案.so 費了點功夫,總算get了編寫共享庫(Shared Library,Windows下稱為“動態連結庫”,即Dynamic Link Library)和呼叫的這個新技能! 動態連結庫的好處是不言而喻的,一個稍微複雜一點的程式,頂層設計的時候良好
【Linux】makefile的編寫
昨天把程式移植到linux改了bug以後,感覺好麻煩 每次編譯都要輸那麼長一堆命令,容易輸錯,而且沒有變的原始碼也順便重新編譯了一次,很浪費時間。 當時用了別名,發現不能實現需求。 嗯,學一學makefile怎麼寫 基本語法 target : prerequisites <ta
Linux下Makefile的automake生成全攻略
作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。 在本文中,將給大家介紹如
Python MySQLdb在Linux下的快速安裝
1.最快速最簡單方法(趕時間的話) 可能遇到問題: 原因:之前使用編譯的方法進行安裝,下的是1.2.3,但是用yum目前最高1.2.1,衝突 解決方法:刪除已經編譯的檔案 再進行 無錯誤,則表示成功了 2.自己編譯安裝 需要: A.gcc B.setuptools
Linux下Makefile檔案常用知識總結
1.Makefile檔案命令的使用 一般有兩種用法 #1 make #2 make command 第一種用法會自動執行Makefile中的所有指令,第二種用法會執行Makefile中的指定指令。 2.Makefile檔案命令的一般寫法 目標: 依賴項1 依賴項2
[轉]linux下Makefile的automake生成全攻略
2006-07-19 作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Make
linux下用C編寫ftp客戶端
這是一個大作業,要求能夠模擬ftp協議,實現一個ftp客戶端,然後要求能夠實現相應的功能,主要是能夠實現ls,pwd,cwd(cd),put和get功能。然後是在被動模式下來實現這些功能。那麼首先我們需要對ftp協議有一個具體的瞭解,然後才能夠自己實現這個功能。 FTP
Linux下Makefile指令碼
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實現的非常簡單的阻塞的傳送傳送
[轉貼]Linux下Makefile的automake生成全攻略[-]
作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。 在本文中,將給大家介紹如何使用 a
linux下對qt編寫的程序進行部署
gcc line oca 12px 完成 可執行 document uil bzip 當我們完成程序設計之後,需要將可執行程序交付客戶,而運行環境裏面可能是沒有相關支持庫的,這個時候就涉及到部署的相關問題。對於我們在Linux下基於QT編寫的圖像處理程序,我們采用lin
Linux下Makefile的自動生成步驟
一、 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
Linux下norflash驅動編寫方法
Linux下norflash驅動編寫步驟 1. 分配map_info結構體 2. 設定: 物理基地址(phys), 大小(size),