Ubuntu——Makefile檔案與make命令
在Shell指令碼中使用make命令來進行編譯,尤其在C/C++開發中,make命令通過makefile檔案中描述源程式之間的依賴關係進行自動編譯;makefile檔案是按照規定格式編寫,需說明如何編譯各個原始檔並連線生成可執行檔案,並要求定義原始檔之間的依賴關係;
很多大型專案的編譯都是通過 Makefile 來組織的, 如果沒有 Makefile, 那很多專案中各種庫和程式碼之間的依賴關係不知會多複雜。
make
make常見指令
make命令後接引數,稱為目標;常見目標如下圖所示:
指令 | 含義 |
---|---|
make all | 編譯所有目標 |
make -j | 使用所有的核心編譯目標 |
make -j8 | 使用8個核心編譯目標 |
make install | 安裝已編譯的程式 |
make uninstall | 解除安裝已安裝的程式 |
make clean | 刪除由make命令產生的檔案,通常刪除目標檔案.o |
make distclean | 刪除由./configure產生的檔案 |
make check | 測試剛編譯的軟體 |
make installcheck | 檢查安裝的庫和程式 |
make dist | 重新打包成packname-version.tar.gz |
執行make命令時,需要一個Makefile檔案,以告訴make命令如何編譯和連結程式;
make如何工作
- make在當前目錄下尋找“Makefile”或“makefile”檔案
- 若找到,查詢檔案中的第一個目標檔案.o
- 若目標檔案不存在,根據依賴關係查詢.s檔案
- 若.s檔案不存在,根據依賴關係查詢.i檔案
- 若.i檔案不存在,根據依賴關係查詢.c檔案,此時.c檔案一定存在,於是生成一個.o檔案,再去執行
Makefile檔案
Makefile檔案由一系列規則rules構成,每條規則形式如下:
<target>: <prerequisites>
[Tab]<commands>
第一行冒號前為目標,冒號後為前置條件;第二行必須由一個Tab鍵起首,後接命令;目標是必須的,不可省略;前置條件和命令是可選的,但兩者必須至少存在一個。
目標target
目標可以是檔名,指明make命令所要構建的物件;也可以是某個操作名稱,稱“偽目標”;
clean:
rm *.o
以上程式碼目標是clean,命令是rm *.o;
執行make clean命令,實現物件檔案的刪除;
前置條件prerequisites
前置條件通常是一組檔名,用空格隔開;
指定目標是否重新構建的判斷標準——只要有一個前置條件不存在或有更新,則該目標需重新構建;
result.txt:source.txt
cp source.txt result.txt
若當前路徑下source.txt存在,make result.txt可正常執行,否則需再寫一條規則,用於生成source.txt;
source.txt:
echo "This is a source file." > source.txt
source.txt沒有前置條件,與其他檔案文官,只要該檔案不存在,每次執行make source.txt命令都會生成該檔案;
命令commands
命令表示如何更新目標檔案,由一行或多行shell命令組成;
注:
shell命令一定是寫在命令中,否則會被make忽略;
每行命令前必須有一個Tab鍵;
每行命令在一個獨立的shell中執行,shell之間沒有繼承關係,因此上一行為的變數賦值,在下一行無效;
若前後兩條命令有共享資料,可寫在一行,用分號隔開;
var-kept:
export foo=bar;echo "foo=[$$foo]"
語法
指令 | 含義 |
---|---|
# | 註釋 |
echoing | 正常情況下,make列印每條命令,再執行該命令,稱回聲;在命令前加@,關閉回聲,即只輸出命令的執行結果,出錯則停止執行 |
% | make命令允許對檔名進行類似正則運算的匹配,主要用到% |
()中 |
賦值運算子
指令 | 含義 |
---|---|
= | 遞迴展開賦值,預設賦值方式 |
:= | 直接賦值,不會遞迴展開,若引用的變數不存在,則為空串 |
?= | 若未初始化,則賦值 |
+= | 將值追加到現有內容末尾 |
自動變數
指令 | 含義 |
---|---|
[email protected] | 當前目標 |
$< | 第一個前置條件 |
$? | 所有比目標更新的前置條件 |
$^ | 所有前置條件 |
判斷語句
<條件語句>
<條件為真,執行程式段>
else
<條件為假,執行程式段>
endif
1. 比較兩個引數值是否相等
ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq 'arg1' "arg2"
ifeq "arg1" 'arg2'
注:引數還可用make函式,如ifeq ((foo)),);
2. ifneq 比較兩個引數值是否不等
ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq 'arg1' "arg2"
ifneq "arg1" 'arg2'
3. ifdef 判斷變數是否有值
ifdef var
4. ifndef 判斷變數是否無值
ifndef var
迴圈
LIST變數是Makefile變數,引用Makefile變數需使用$()
括起來;
而all目標後的命令是shell命令,其中定義的變數也是shell變數,引用shell變數需使用$$作為開頭,但shell變數不需括號;
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
all:
for i in one two three; do \
echo $$i; \
done
參考
相關推薦
Ubuntu——Makefile檔案與make命令
在Shell指令碼中使用make命令來進行編譯,尤其在C/C++開發中,make命令通過makefile檔案中描述源程式之間的依賴關係進行自動編譯;makefile檔案是按照規定格式編寫,需說明如何編譯各個原始檔並連線生成可執行檔案,並要求定義原始檔之間的依
ipfs在ubuntu的安裝與基本命令
星際檔案系統(InterPlanetary File System,縮寫ipfs)是一個旨在建立持久且分散式儲存和共享檔案的網路傳輸協議。該技術是一種內容可定址的對等超媒體分發協議。在IPFS網路中的節點將構成一個分散式檔案系統。 IPFS是一個對等的分散式檔案系統,它嘗試
Ubuntu DNS配置與使用命令設定Ubuntu的ip地址
經過長時間學習Ubuntu DNS,你可能會遇到Ubuntu DNS中網路問題,這裡將介紹Ubuntu DNS解決網路問題的方法,新裝了Ubuntu,雖然使用圖形介面明明已經設定好了ip,閘道器等等,但是不能上網。 一個朋友提醒說,也許是設定的問題,試試命令列的設定。於是搜
C語言 makefile檔案與標頭檔案的寫法。
makefile 檔案的書寫。 總結下make 執行過程 1)make 在當前目錄下找 "Makefile"或"makefile"的檔案 2)如果找到,則會找檔案中第一個目標檔案(target)。 3)如果 main 命令的執行,依賴後面命令執
makefile 規則之---make命令-編譯,依賴關係
make命令的核心是找依賴性,make命令會一層又一層地區找檔案的依賴關係,知道最終編譯出目標檔案,在找尋過程中,如果出現錯誤,比如最後被依賴的檔案找不到,那麼make就會直接退出,並報錯,而
make命令與makefile檔案
一、多個原始檔帶來的問題 在編寫c/c++測試程式時,我們習慣每次修改一處程式碼,然後就馬上編譯執行來檢視執行的結果。這種編譯方式對於小程式來說是沒有多大問題的,可對於大型程式來說,由於包含了大量的原始檔,如果每次改動一個地方都需要編譯所有的原始檔,這個簡單的
簡介make命令和makefile檔案
一、為什麼要用到 make 命令和 makefile 檔案 在 Linux 下編寫一個程式,每次編譯都需要在命令列一行一行的敲命令。如果是一個很小的程式還好說,命令不怎的複雜,編譯速度也挺快,但是對於大型程式來說,這樣無疑很麻煩,且不說可能會敲錯命令,有時候僅僅改動了一個小地方,卻需要將整個程式全部重新
ubuntu 16 的ls 命令以及檔案與目錄操作
1. ls , ls[options][file_or_dirs](1). ls,列出當前目錄的內容(2). ls /,顯示根目錄的內容(3). ls -a,顯示隱藏的目錄和檔案(4). ls -l,顯示檔案的詳細資訊,檔案目錄具有的許可權,當前許可權檔案的數量,擁有者,所屬
linux中make命令的簡單使用以及Makefile檔案的書寫
Makefile 會不會寫makele,從一個側面說明了一個是否具備完成大型工程的能力。 一個工程中的源件不計數,其按型別、功能、模組分別放在若干個目錄中,makele定義了一系列的規則來指
make命令和makefile
空格 這一 file mman 情況 相關 描述 end targe make命令和Makefiles: 1. make是一個命令,解釋makefile中指令的命令工具,不同的IDE有自己的make命令。 1. make命令不知道怎麽去構建程序,必須有一個文件告訴make命
linux系統下ubuntu重啟apache服務命令及檔案許可權設定
常用修改許可權的命令: sudo chmod 600 ××× (只有所有者有讀和寫的許可權) sudo chmod 644 ××× (所有者有讀和寫的許可權,組使用者只有讀的許可權) sudo chmod 700 ××× (只有所有者有讀和寫以及執行的許可權) sudo chmod
ubuntu檔案解壓命令符 +QQ+xx-net 配置
1.解壓縮命令 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 將DirName資料夾打包成一個FileName.tar檔案 打包:將一大堆檔案或目錄變成一個總的檔案, 壓縮:將一個大的檔案通過一些壓縮演算法變成
虛擬機器下ubuntu中檔案實現與windows中檔案共享
第一步 在Ubuntu選單上選擇VM->install VMware tools。然後出現VMware tools的安裝壓縮包檔案VMwareTools-9.2.0-799703.tar.gz。 第二步 可以先將該壓縮檔案複製到主資料夾下,然後解壓tar.gz
簡介make命令和makefile文件
tab linux 後綴 依賴關系 函數調用 創建方式 href oca printf 一、為什麽要用到 make 命令和 makefile 文件 在 Linux 下編寫一個程序,每次編譯都需要在命令行一行一行的敲命令。如果是一個很小的程序還好說,命令不怎的復雜,編譯速
Linux移動檔案與目錄-mv命令的10個實用例子
mv 命令 mv 命令是一個與cp類似的命令,但是它並非建立檔案或目錄的複製品/副本。不管你在使用什麼版本的Linux系統,mv 都預設安裝在你的Linux系統上了。 來看一下 mv 命令在日常操作中的一些例子。 1.移動檔案 移動檔案時需要注意的是檔案的源地址和目標地址必須不同
檔案型別與許可權及檔案相關操作命令
檔案型別 第一個符號代表檔案型別: - 普通檔案 d 資料夾(目錄) l 連結檔案 c 字元裝置檔案 b 塊裝置檔案 後面9個字元代表檔案的許可權 r 可讀 w
ubuntu的安裝與vim(部分)檔案的配置
Ubuntu的安裝與vim相關的配置 虛擬機器環境的安裝(先說說虛擬機器的安裝步驟把) 對於安裝ubuntu來講不是很難掌握,但是在Linux系統虛擬機器下提供了很多便利的手段,而要配置一個順手的虛擬機器環境就不是那麼省心了。但對於一個小白來講,有一個趁手的環境還是不錯的選擇。特別是vim的一些配置很重要
ubuntu檔案與資料夾屬性
ls -al 列出所有檔案詳細的屬性與許可權 [-] [rw-r] [--r] [---]:含義分別為 1 234 567 890 檔案型別 檔案所有者許可權 檔案所屬使用者組許可權 其他人許可權 [d]:表示為目錄 [-]:表示為檔案 [|]:
Linux中常用命令(檔案與目錄)
1、pwd 檢視當前目錄(Print Working Directory) 2、cd 切換工作目錄(Change Directory) (1)格式:cd [目錄位置] 特殊目錄: .當前目錄 ..上一級目錄 ~使用者主目錄 -上個
Ubuntu虛擬機器與Windows主機之間互傳檔案
首先ubuntu要安裝配置SSH Ubuntu 下安裝 OpenSSH Server 是無比輕鬆的一件事情,需要的命令只有一條: sudo apt-get install openssh-server