1. 程式人生 > >Ubuntu——Makefile檔案與make命令

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如何工作

  1. make在當前目錄下尋找“Makefile”或“makefile”檔案
  2. 若找到,查詢檔案中的第一個目標檔案.o
  3. 若目標檔案不存在,根據依賴關係查詢.s檔案
  4. 若.s檔案不存在,根據依賴關係查詢.i檔案
  5. 若.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 ((strip(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