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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...