make與makefile

来源:http://www.cnblogs.com/Carrie-0173/archive/2017/01/25/6349826.html
-Advertisement-
Play Games

當我們寫程式過程中存在多個文件之間有複雜的包含關係時,若修改了其中一個源文件,就重新編譯所有文件,一般是不必要的,並且當文件很多時,就顯得非常笨拙。所有包含該文件的文件需要重新編譯,而其它無關係的文件則不需要編譯,但往往判斷的這個過程會很令程式員頭疼,並且一不小心就會出現某些需要重新編譯的文件被遺漏 ...


        當我們寫程式過程中存在多個文件之間有複雜的包含關係時,若修改了其中一個源文件,就重新編譯所有文件,一般是不必要的,並且當文件很多時,就顯得非常笨拙。所有包含該文件的文件需要重新編譯,而其它無關係的文件則不需要編譯,但往往判斷的這個過程會很令程式員頭疼,並且一不小心就會出現某些需要重新編譯的文件被遺漏的情況,這樣就會使程式無法正常工作。 

 

        make就可以解決上述問題,它會在必要時編譯所有受改動影響的源文件。 

但是make自身是不能完成這項任務的,我們需要為其提供一個文件,告訴它如何去處理文件之間的關係,這個文件就是makefile文件 

 

       就是在makefile文件中按照一定的格式把要生成的文件在編譯時所需要的源文件以及編譯規則寫出來。這樣,make會根據makefile文件按照規則在需要時重新編譯所有受改動影響的源文件可以同時存在多個不同的makefile文件分別管理項目的不同部分。makefile文件一般和其它源文件放在同一目錄下。 

 

make -f  makefile文件名      

    -f 選項就是指定將哪個文件作為makefile文件。如果沒有使用-f選項,標準版本make命令將首先在當前目錄下找名字為makefile的文件,找不到會繼續查找Makefile的文件。(特殊的GNU Make則會按照GNUmakefilemakefileMakefile的順序搜索) 

 

        makefile文件由一組依賴關係規則構成。完整的makefile文件例子會在後面列出 

 

makefile中的每個依賴關係 一個目標文件(一般為要創建的可執行文件)和一組該目標所依賴的源文件組成。 

makefile文件依賴關係的寫法()如下: 

 

mypro:   main.o  myc1.o 

main.o:  main.c  a.h  b.h 

myc1.o:  myc1.c  b.h 

mypro1:   mypro1.c 

 

最開始是目標文件名稱,然後一個冒號,後面是目標文件所依賴的源文件(冒號和後面的源文件之間以及不同源文件之間用空格或製表符間隔) 

 

特別需要註意的是,雖然makefile文件中已經寫入了多個目標文件,但是如果只是這樣執行 make make命令只會創建makefile文件中的第一個目標,即mypro 

若要一次性創建makefile中的所有文件,需要在makefile文件的第一個目標定義為all(我們稱之為偽目標),即: 

 

all:  mypro  mypro1 

mypro:   main.o  myc1.o 

main.o:  main.c  a.h  b.h 

myc1.o:  myc1.c  b.h 

mypro1:   mypro1.c 

 

或者執行make命令時,加上all參數 :   make  all 

 

makefile文件的規則 

規則就是指當make創建目標文件時的方式,比如在編譯myc1.o文件時,如何進行編譯(如可能需要指定頭文件的目錄等)。 

在此應特別註意makefile文件中的 空格  製表符 是有區別的。規則所在的行必須以 製表符 開頭,不可以用空格。並且makefile文件中不能以空格結尾,可能會使make命令執行失敗(這屬於歷史遺留問題) 

 

另外,makefile文件中可以使用巨集定義 

 

下麵舉例完整的makefile文件: 

定義一個命名為Makefile123makefile文件 

#cat Makefile123 

 

all: mypro 

#This is a makefile 

#the compiler 

CC = gcc 

#the path 

INCLUDE = . 

#where to install 

INSTDIR = /usr/local/bin 

install: mypro 

@if [ -d $(INSTDIR) ]; \ 

then \ 

cp mypro $(INSTDIR) &&\ 

chmod a+x $(INSTDIR)/mypro &&\ 

chmod og-w $(INSTDIR)/mypro &&\ 

echo "Installed in $(INSTDIR)" ;\ 

else \ 

echo "Sorry, $(INSTDIR) does not exist" ; \ 

fi 

 

mypro: main.o c1.o 

gcc -o mypro main.o a.o 

main.o: main.c m.h 

$(CC) -I$(INCLUDE) -c main.c 

c1.o: c1.c 

$(CC) -c c1.c 

clean: 

-rm main.o c1.o 

 

 

1make中的特殊符號 

  • 告訴make命令忽略所有錯誤 

    @   告訴make執行某條命令前不要將該條命令顯示在準輸出上  

  #  makefile中的註釋符號 

    CC = gcc 以及 INCLUDE = . INSTDIR = /usr/local/bin makefile中自行建立的的巨集定義,引用方式為$(CC)$(INCLUDE)$(INSTDIR) 

2、註意all只指定了一個目標mypro,所以只執行 make -f Makefile123時,則預設只創建目標mypro 

我們可以看到在Makefile123文件中存在兩個目標clean  install 

install依賴於mypro ,執行make -f Makefile123 install時,make會自行判斷創建文件的正確順序 

    該文件中目標install的規則由一串shell腳本命令組成,此處註意,make命令在執行規則時會調用一個shell,並且每個規則都使用一個新的shell,所以在代碼結尾加上反斜杠\,使得所有shell腳本命令在邏輯上處於一行。 &&符號保證保證前面的命令執行成功後面的才會繼續執行。 

clean目標後面沒有依賴文件,則執行 make -f Makefile123 clean時,clean對應的規則總會執行,而不是像其他目標一樣只有在依賴文件發生變化時執行規則。 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原本的字元設備只能有255個驅動程式,原因是一個主設備號占用了0~255的次設備號 把register_chrdev展開可得到一下幾個部分:register_chrdev_region/alloc_chrdev_region,cdev_init,cdev_add 參照register_chrdev的 ...
  • 1 分析i2c設備的識別過程i2c_add_driver i2c_register_driver driver->driver.bus = &i2c_bus_type; driver_register(&driver->driver); list_for_each_entry(adapter, &a ...
  • 1 確定相異性 1.1 選中網卡晶元nGCS4 1.2 確定相異性:基地址,中斷號,設置時序(記憶體控制器BWSCON,BANKCONn) 1.3 修改相應的部分 2 測試DM9000C驅動程式:2.1 把dm9dev9000c.c放到內核的drivers/net目錄下2.2 修改drivers/ne ...
  • 1 網路傳輸的簡介 (1)接收過程,如上圖,網路上的數據包到達網卡後,網卡產生中斷,然後設備驅動層收到中斷後,開始進行網路包的接收,接收完之後調用一個netif_rx函數交給網路協議層(層次結構上圖一),然後就是一層一層的網上傳到用戶空間了。 (2)發送過程,從用戶空間過來的數據包,經過層層穿越之後 ...
  • Linux 意外操作後如何進行數據搶救 在 GUI 中使用 組合鍵或是 CLI 下使用 刪除選項,這個文件並沒有從硬碟(或是其它存儲設備)上徹底銷毀。當它文件被刪除以後, 的數據指針部分被清零,僅僅是從系統的目錄結構中被移除,但是這個文件仍然存在你磁碟中的某個 物理位置上。( 或 查詢一個文件所對應 ...
  • Hook是什麼? hook翻譯之後是鉤子的意思,hook的用途主要是用來攔截消息的,看到這裡大家可能會迷茫,What is a hook?所以這時就不得不普及一下操作系統的原理。 舉個例子:假如你是一名游戲熱衷者,在玩游戲時,你要釋放技能那麼你就會對鍵盤滑鼠進行操作,錶面上你是直接操作游戲,其實中間 ...
  • 作者:彭東林 郵箱:[email protected] QQ:405728433 平臺 tiny4412 ADK Linux-4.9 概述 前面一篇博文基於tiny4412的Linux內核移植 實例學習中斷背後的知識(1)結合示例分析了一下新版kernel引入設備樹和irq domain後 ...
  • ylin的狀態欄(啟動器)改成ubuntu之前的樣子,ubuntu是在左邊的,kylin在底部。占空間。 執行命令 gsettings set com.canonical.Unity.Launcher launcher-position Left 啟動器放在左邊,屏幕空間更大些。 放底部 gsett ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...