make 與makefile的作用
在開發一個系統時,一般是將一個系統分成幾個模組,這樣做提高了系統的可維護性,但由於各個模組間不可避免存在關聯,所以當一個模組改動後,其他模組也許會有所更新,當然對小系統來說,手工編譯連線是沒問題,但是如果是一個大系統,存在很多個模組,那麼手工編譯的方法就不適用了。為此,在Linux系統中,專門提供了一個make命令來自動維護目標檔案,與手工編譯和連線相比,make命令的優點在於他只更新修改過的檔案(在Linux中,一個檔案被建立或更新後有一個最後修改時間,make命令就是通過這個最後修改時間來判斷此檔案是否被修改),而對沒修改的檔案則置之不理,並且make命令不會漏掉一個需要更新的檔案。
檔案和檔案間或模組或模組間有可能存在倚賴關係,make命令也是依據這種依賴關係來進行維護的
即make和makefile的關係是:make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,
1、makefile
makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為
makefile就像一個Shell指令碼一樣,其中也可以執行
makefile的產生:
對於很大的專案來說,自己手寫Makefile非常麻煩,而標準的GNU軟體(如Apacle)都是執行一個configure指令碼檔案來產生Makefile;GNU軟體automake和autoconf就是自動生成configure的工具。開發人員只需要先定義好巨集,automake處理後會產生供autoconf使用的Makefine.in,再用autoconf就可以產生configure。
2、make命令
make
根據Makefile檔案編譯原始碼、連線、生成目標檔案、可執行檔案。
make clean
清除上次的make命令所產生的object檔案(字尾為“.o”的檔案)及可執行檔案。
make install
將編譯成功的可執行檔案安裝到系統目錄中,一般為/usr/local/bin目錄。
make dist
產生髮布軟體包檔案(即distribution package)。這個命令將會將可執行檔案及相關檔案打包成一個tar.gz壓縮的檔案用來作為釋出軟體的軟體包。 它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的檔案。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE,
VERSION)。
make distcheck
生成釋出軟體包並對其進行測試檢查,以確定釋出包的正確性。這個操作將自動把壓縮包檔案解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟體包已經準備好,可以釋出了。
make distclean
類似make clean,但同時也將configure生成的檔案全部刪除掉,包括Makefile檔案。
另外一些說明:
$ make -f Makefile.debug 例如,一個名為prog的程式由三個C原始檔filea.c、fileb.c和filecMakefile檔案工程樣例
.c以及庫檔案LS編譯生成,這三個檔案還分別包含自己的標頭檔案a.h 、b.h和c.h。通常情況下,C編譯器將會輸出三個目標檔案filea.o、fileb.o和filec.o。假設filea.c和fileb.c都要宣告用到一個名為defs的檔案,但filec.c不用。即在filea.c和fileb.c裡都有這樣的宣告: #include "defs" 那麼下面的文件就描述了這些檔案之間的相互聯絡: 0 #It is a example for describing makefile 註釋行 1 prog : filea.o fileb.o filec.o #指定prog由三個目標檔案filea.o、fileb.o和filec.o連結生成 2 cc filea.o fileb.o filec.o -LS -o prog #如何從prog所依賴的檔案建立可執行檔案 3 filea.o : filea.c a.h defs #指定filea.o目標檔案,以及它們所依賴的.c和.h檔案以及defs檔案 4 cc -c filea.c #如何從目標所依賴的檔案建立目標,即如何從filea.c建立filea.o 5 fileb.o : fileb.c b.h defs #指定fileb.o目標檔案,以及它們所依賴的.c和.h檔案以及defs檔案 6 cc -c fileb.c #如何從目標所依賴的檔案建立目標,即如何從fileb.c建立fileb.o 7 filec.o : filec.c c.h #指定filec.o目標檔案,以及它們所依賴的.c和.h檔案 8 cc -c filec.c #如何從目標所依賴的檔案建立目標,即如何從filec.c建立filec.o 這個描述文件就是一個簡單的makefile檔案。我們針對上例的程式碼方面進行一些基礎性說明:CC 是一個全域性變數,它指定你的Makefile所用的編譯器,一般預設是gcc;.o檔案是unix下的中間程式碼目標檔案,就如同在windows下的.obj檔案一樣,在unix下生成.o檔案的過程叫編譯(compile),將無數.o檔案集合生成可執行檔案的過程叫連結(link);有時會在unix介面下看到.a檔案,那是Archive File,相當於windows下的庫檔案Library File,.a檔案作用是:由於原始檔太多(上例是指.c和.h檔案過多),編譯生成的中間目標檔案(.o檔案)太多,而在連結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給中間目標檔案打個包,這個包就是.a檔案。 當filea.c或a.h檔案在編譯之後又被修改,則 make 工具可自動重新編譯filea.o,如果在前後兩次編譯之間,filea.c 和a.h 均沒有被修改,而且filea.o還存在的話,就沒有必要重新編譯。這種依賴關係在多原始檔的程式編譯中尤其重要。通過這種依賴關係的定義,make 工具可避免許多不必要的編譯工作。當然,利用Shell指令碼也可以達到自動編譯的效果,但是,Shell 指令碼將全部編譯任何原始檔,包括哪些不必要重新編譯的原始檔,而 make 工具則可根據目標上一次編譯的時間和目標所依賴的原始檔的更新時間而自動判斷應當編譯哪個原始檔。 Makefile檔案準備好之後,接著在Makefile檔案所在的目錄下敲入make這個命令就可以了,根據Makefile檔案,以告訴make命令需要怎麼樣的去編譯和連結目標程式。相關推薦
make 與makefile的作用
在開發一個系統時,一般是將一個系統分成幾個模組,這樣做提高了系統的可維護性,但由於各個模組間不可避免存在關聯,所以當一個模組改動後,其他模組也許會有所更新,當然對小系統來說,手工編譯連線是沒問題,但是如果是一個大系統,存在很多個模組,那麼手工編譯的方法就不適用了。為此,在
linux之make與makefile
make是一個命令,Makefile是一個檔案(可大寫也可以小寫) Makefile裡面放的是依賴關係和依賴方法 新建一個makefile檔案,在Makefile裡寫: hello:hello.c gcc -o hello hello.c
make與makefile的基本使用與深入
一、 工具make的使用與makefile指令碼 背景: make編譯指令碼解釋 編譯指令碼makefile make -f 指令碼檔案 目標 指令碼檔案: 1. 文字檔案 (例如 d
make命令與makefile檔案
一、多個原始檔帶來的問題 在編寫c/c++測試程式時,我們習慣每次修改一處程式碼,然後就馬上編譯執行來檢視執行的結果。這種編譯方式對於小程式來說是沒有多大問題的,可對於大型程式來說,由於包含了大量的原始檔,如果每次改動一個地方都需要編譯所有的原始檔,這個簡單的
uboot中 make xxx_config 的作用(以make smdk2410_config為例)
mdk nbsp xxx cpu clu samsung uboot 作用 頭文件 1、創建到目標板相關文件的鏈接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/pr
30天自制操作系統(二)匯編語言學習與Makefile入門
-c 如何 wid 開發 大小端 bio strong 入門 小端 1 介紹文本編輯器 這部分可直接略過 2 繼續開發 helloos.nas中核心程序之前的內容和啟動區以外的內容先不講了,因為還涉及到一些軟盤方面的知識。然後來講的是helloos.nas這個文件 ; h
JS - 箭頭函數與 () {} 的作用域
bsp foo zha his 全局 {} ole const ... foo () { // ... } 等價於 foo: function () { // ... } foo: () => { // ... } 範例: // 全局
學習總結:工程管理與makefile
管理 用法 ron 有效 第一個 可執行 多目錄 log 包含 工程管理與makefile 一、為什麽需要makefile和make 一個工程中的源文件可能很多,按照類型、功能、模塊分別放在若幹個目錄中,為了有效地管理軟件工程,更高效地編譯整個工程,需要用到makefile
Linux內核(1) - Kernel地圖:Kconfig與Makefile
led page 一個 兩個 驅動 ash and 基本上 ttl Makefile不是Make Love 從前在學校,混了四年,沒有學到任何東西,每天就是逃課,上網,玩遊戲,睡覺。畢業的時候,人家跟我說Makefile我完全不知,但是一說Make Love我就來勁了,現在
javaScript教程50: 變量查找規則與詞法作用域
全局 如果 code 變量賦值 style 調用函數 幫我 bsp define 作用域: 1 在es5.0中只有函數可以構成一個作用域 2 全局作用域: 整個js代碼執行的環境 3 局部作用域: 函數可以構成一個局部作用域 4 全局變量: 在全局作用域中申明的變量 5 局
Gradle與Makefile構建工具的對比
tro 2.4 ani 所有 常用 基礎 assemble 第三方 ron 隨著Android Studio的普及,越來越多的Android開發者也要開始了解和學習Gradle這款強大的代碼構建工具了。我們在學習和了解一項新事物的時候,最快速的方法往往是與已知的事物進行比較
Make & Makefile
ets 備份 details 內核配置 onf bsp 幫助 prop iou make clean和make distclean的區別 對於Linux內核而言,可通過make help查看相關的幫助信息 Cleaning targets: clean
go語言中make與new操作
make用於內建型別(map、slice和channel)的記憶體分配。new用於各種型別的記憶體分配。 內建函式new本質上說跟其它語言中的同名函式功能醫院:new(T)分配了零值填充的T型別的記憶體空間,並且返回其地址,即一個*T型別的值。用Go的術語說,它返回了一個指標,指向新分配的型別T
make之makefile 十 函式庫檔案
一、簡單的靜態庫書寫編譯和測試 檔案目錄如下所示: . ├── Makefile ├── MakefileTest ├── include.c ├── include.h └── main.c 0 directories, 5 files 其中main.c函式裡面會呼叫includ
SpringBean作用域——基本作用域與web作用域
Spring的 bean有5種作用域分別是:singleton、prototype、request、session和globalSession(不常用)。 其中後三種request、session、global session專用於Web應用程式。 1、singleton 單例 在S
Static與Const作用
程式的區域性變數存在於(堆疊)中,全域性變數存在於(靜態區 )中,動態申請資料存在於( 堆)中。 1.作用於變數: 用static宣告區域性變數-------區域性變數指在程式碼塊{}內部定義的變數,只在程式碼塊內部有效(作用域),其預設的儲存方式是自動變數或說是動態儲存的,即指令執行
深入學習JavaScript之函式作用域與塊作用域
我們將作用域比作氣泡,一層巢狀一層,每一個氣泡裡面都可以放置識別符號(函式,變數)的定義,這些氣泡在書寫階段就已經確定了。 但是,究竟是什麼生成了一個新的氣泡,只有函式能夠生成氣泡嗎?JavaScipt中的其他結構能生成作用域氣泡嗎? 1.1 函式中的
藥與心理作用
藥與心理作用 柳鯤鵬 2010-12-23 關鍵字:藥 心理 中醫 簡介:藥的真實作用中,心理作用佔了很大部分。因為吾親眼看過有人吃下藥一秒鐘感冒症狀全部消失的例子。 藥的心理作用有多大?吾大學時得過一次較重的感冒,花費巨資買了藥,吃下
make之makefile 三 書寫規則
makefile的規則包括兩個部分,一個是依賴關係,一個是生成目標的方法。 在Makefile中,規則的順序是非常重要的,由於,Makefile中僅僅應該有一個最終目標,其他的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什麼。一般來說,定義在Makefile中的目標
make之makefile 二 總述
此文章是我從另一篇文章中提取出來的,分類出來,便於初學者學習檢視,該文章地址:https://www.cnblogs.com/mfryf/p/3305778.html 一、Makefile裡有什麼? Makefile裡主要包括了五個東西:顯式規則、隱晦規則、變數定義、檔案指示和凝視。