【Linux】Makefile(一)-介紹

Makefile

本篇博客是作者在學習Linux方面知識過程中,對Makefile片面的了解,從而產生了對Makefile有一個全面的認識的想法,在知道《跟我一起寫Makefile》此書后,作者學習閱讀過程中整理出的筆記。

目錄

  • Makefile
  • makefile介紹:
    • 規則:
    • 示例:
    • 使用變量:
    • 自動推導:
    • [.o]和[.h]的依賴文件收攏:
    • 清空目標文件的規則:
    • Makefile文件名:
    • 引用其他Makefile
    • 環境變量MAKEFILES
    • make 的工作方式

makefile介紹:

make 命令執行時,需要一個 Makefile 文件,以告訴 make 命令需要怎么樣的去編譯和
鏈接程序。 規則是:

1)如果這個工程沒有編譯過,那么我們的所有 C 文件都要編譯并被鏈接。

2)某幾個 C 文件被修改,只編譯被修改的 C 文件,并鏈接目標程序。

3)頭文件被改變了,需要編譯引用了這幾個頭文件的 C 文件,并鏈接目標程序。

規則:

target … : prerequisites …

command

解釋:

target 也就是一個目標文件,可以是 Object File,也可以是執行文件。還可以是一個標簽(Label)。

prerequisites 是要生成那個 target 所需要的文件或是目標。

command是make需要執行的命令。

依賴關系:

target 這一個或多個的目標文件依賴于prerequisites 中的文件,其生成規則定義在 command 中。

示例:

edit : main.o command.o \

display.o

cc -o edit main.o command.o \

display.o

main.o : main.c defs.h

cc -c main.c

command.o : command.c defs.h command.h

cc -c command.c

display.o : display.c defs.h buffer.h

cc -c display.c

clean :

rm edit main.o command.o display.o \

反斜杠(\)是換行符的意思,便于 Makefile 的易讀,

目標文件(target)包含:執行文件 edit 和中間目標文件(*.o),

依賴文件(prerequisites)就是冒號后面的那些 .c 文件和 .h 文件

Tab 鍵作為開頭

make 并不管命令是怎么工作的,他只管執行所定義的命令,

Makefile 中只有行注釋,和 UNIX 的 Shell 腳本一樣,其注釋是用“#”字符。

clean 不是一個文件,它只不過是一個動作名字,類似于標簽(lable),

要執行其后的命令,就要在 make 命令后明顯得指出這個lable 的名字

使用變量:

如果 makefile 很復雜,那么我們就有可能會忘掉一個需要加入的地方,而導致編譯失敗。

為了 makefile 的易維護,在 makefile 中我們可以使用變量。makefile 的變量也就是一個字符串,可以理解成 C 語言中的宏。

objects = main.o command.o \

display.o

edit : $(objects)

cc -o edit $(objects)

main.o : main.c defs.h

cc -c main.c

command.o : command.c defs.h command.h

cc -c command.c

display.o : display.c defs.h buffer.h

cc -c display.c

clean :

rm edit $(objects)

聲明一個變量,叫 objects,在 makefile 中以“$(objects)”的方式來使用這個變量,如果有新的 .o 文件加入,我們只需簡單地修改一下 objects 變量就可以了。

自動推導:

我們的 make 會自動識別,并自己推導命令。

只要 make 看到一個[.o]文件,它就會自動的把[.c]文件加在依賴關系中,如果 make找到一個 whatever.o,那么 whatever.c,就會是 whatever.o 的依賴文件。就不用寫cc -c whatever.c。

[.o]和[.h]的依賴文件收攏:

格式:

右邊對應每一個[.h]文件,左邊是需要右邊[.h]文件的對應的[.o]文件

示例:

$(objects) : defs.h

kbd.o command.o files.o : command.h

display.o insert.o search.o files.o : buffer.h

這種風格,讓我們的 makefile 變得很簡單,但文件依賴關系有些凌亂。

一是文件的依賴關系看不清楚,二是如果文件一多,要加入幾個新的.o 文件。

清空目標文件的規則:

每個 Makefile 中都應寫一個清空目標文件(.o 和執行文件)的規則,這不僅便于重

編譯,也利于保持文件的清潔。

一般的風格是:

clean:

rm edit $(objects)

更為穩健的做法是:

.PHONY : clean

clean :

-rm edit $(objects)

.PHONY 意思表示 clean 是一個“偽目標”,。而在 rm 命令前面加了一個小減號的意思是,也許某些文件出現問題,但不管,繼續做后面的事。

clean 的規則不要放在文件的開頭,clean 放在文件的最后。

Makefile文件名:

默認的情況下,make 命令會在當前目錄下按順序找尋文件名為“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解釋這個文件。

在這三個文件名中,最好使用“Makefile”這個文件名,因為,這個文件名第一個字符為大寫,這樣有一種顯目的感覺。最好不要用“GNUmakefile”,這個文件是 GNU 的 make 識別的。

也可以使用別的文件名來書寫Makefile,

要指定特定的 Makefile,你可以使用 make 的“-f”和“–file”參數,

引用其他Makefile

在 Makefile 使用 include 關鍵字可以把別的 Makefile 包含進來,include 的語法是: include

filename 可以是當前操作系統 Shell 的文件模式(可以包含路徑和通配符)

在 include前面可以有一些空字符,但是絕不能是[Tab]鍵開始

include foo.make *.mk $(bar)

等價于:

include foo.make a.mk b.mk c.mk e.mk f.mk

如果文件都沒有指定絕對路徑或是相對路徑的話,make 會在當前目錄下首先尋找,

如果當前目錄下沒有找到,那么,make 還會在下面的幾個目錄下找:

1、如果 make 執行時,有“-I”或“–include-dir”參數,那么 make 就會在這個參數 所指定的目錄下去尋找。

2、目錄/include(一般是:/usr/local/bin 或/usr/include)存在的話,make 也會去找。

環境變量MAKEFILES

如果你的當前環境中定義了環境變量 MAKEFILES,那么,make 會把這個變量中的值做一個類似于 include 的動作。慎用。

make 的工作方式

make工作的執行步驟如下:

1、讀入所有的 Makefile。

2、讀入被 include 的其它 Makefile。

3、初始化文件中的變量。

4、推導隱晦規則,并分析所有規則。

5、為所有的目標文件創建依賴關系鏈。

6、根據依賴關系,決定哪些目標要重新生成。

7、執行生成命令。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89517.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java爬蟲與正則表達式——用正則來爬取數據

APIJava幫我們寫好的各種功能的Java類。這些Java類統稱為API。正則表達式就是API幫我們寫好的類。正則表達式例子: 字符類:[abc]:只能是a,b或c[^abc]:除了a,b,c之外的任何字符[a-zA-Z]&#xff…

【后端】.NET Core API框架搭建(8) --配置使用RabbitMQ

目錄 1.添加包 2. 連接配置 2.1.連接字符串 2.2.連接對象 3.創建連接服務 3.1.添加配置獲取方法 3.2.服務實現類 3.3.服務接口 4.創建生產者服務 4.1.生產者實現類 4.2.生產者接口 5.創建消費者服務 5.1.消費者服務接口 5.2.消費者接口 6.注冊 7.簡單使用案例 7.1.實現…

Apache SeaTunnel配置使用案例

前置操作 Apache SeaTunnel詳解與部署(最新版本2.3.11)-CSDN博客 mkdir /usr/local/soft/apache-seatunnel-2.3.11/job/ 一、MySQL to HDFS 官方配置參考: MySQL | Apache SeaTunnel Hdfs文件 | Apache SeaTunnel 1、配置確認 將mysq…

GitCode 使用高頻問題及解決方案

GitCode 作為一款強大的版本控制系統,在軟件開發流程中起著舉足輕重的作用。然而,在使用過程中,開發者們常常會遇到各種各樣的問題。本文將匯總 GitCode 使用中的高頻問題,并提供詳細的解決方案,幫助開發者們更順暢地使…

在FreeBSD系統使用chroot進入Ubuntu仿真環境使用Localsend軟件發送和接受文件

LocalSend是一款非常實用的在不同系統(Windows、MacOS、Linux、Android和IOS)傳遞文件的程序。我們這次的實踐,就是要在FreeBSD下也能發送和接收文件。 安裝LocalSend 跟在Ubuntu下安裝非常類似,只是不需要下面的第一步&#xf…

交叉熵損失F.cross_entropy在分類模型中的應用

一、核心思想:通過概率分布懲罰錯誤交叉熵損失的本質是: 比較模型預測的概率分布 vs 真實標簽的概率分布,懲罰兩者之間的差異。例如:真實標簽:圖像 0 → 文本 0(獨熱編碼 [1, 0, 0, ...])模型預…

測試學習之——Pytest Day3

引言Pytest 作為 Python 中最受歡迎的測試框架之一,以其簡潔的語法、強大的功能和豐富的插件生態系統,極大地提升了自動化測試的效率和可維護性。在本文中,我們將深入探討 Pytest 的兩大核心特性:Fixture 和插件管理,幫…

控制Vue對話框顯示隱藏

正確做法 — 使用 Vue 數據驅動控制顯隱你不需要手動設置 display: block&#xff0c;因為 Element Plus 的 <el-dialog> 是基于 v-model 或 :visible.sync 控制的。&#x1f527; 修改模板部分&#xff1a;將原來的&#xff1a;<el-dialog title"報文詳情"…

直播帶貨與開源AI智能名片鏈動2+1模式S2B2C商城小程序:重塑電商營銷新格局

摘要&#xff1a;本文聚焦于直播帶貨對互聯網供需關系的深刻影響&#xff0c;分析其如何改變傳統電商營銷模式&#xff0c;實現從“人找貨”到“貨找人”的轉變。同時&#xff0c;引入開源AI智能名片鏈動21模式S2B2C商城小程序這一創新概念&#xff0c;探討其在直播帶貨背景下的…

Jmeter 性能測試響應時間過長怎么辦?

當 JMeter 性能測試中出現 響應時間過長 的問題時&#xff0c;需要從 測試腳本、服務器、網絡、JMeter配置 等多方面排查和優化。以下是詳細的解決步驟和思路&#xff1a; B站最新性能進階&#xff0c;學會這些jmeter性能測試技能&#xff0c;更助于正確設計、執行和分析性能測…

COZE官方文檔基礎知識解讀第三期 —— prompt(提示詞)

COZE官方文檔基礎知識解讀第三期 —— prompt&#xff08;提示詞&#xff09; 對于初步接觸PE&#xff08;prompt engineering&#xff09; 的小伙伴們&#xff0c;你們可以去火山方舟提供的prompt工具&#xff0c;用工具&#xff08;其余的prompt網站https://www.promptinggu…

代碼隨想錄算法訓練營第三十二天|動態規劃理論基礎、LeetCode 509. 斐波那契數、70. 爬樓梯、746. 使用最小花費爬樓梯

目錄 LeetCode 509. 斐波那契數 70. 爬樓梯 746. 使用最小花費爬樓梯 感想 文檔講解&#xff1a;代碼隨想錄 動態規劃&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;簡稱DP&#xff0c;如果某一問題有很多重疊子問題&#xff0c;使用動態規劃是最有效的。 …

SpringMVC3

一、JSON 與參數傳遞1.1JSON 是什么- JSON 是字符串&#xff1a;比如 {"name":"zhangsan","password":"123456","age":15} 就是一個 JSON 字符串&#xff0c;它用來在前后端、服務間傳遞數據。- JSON 庫&#xff1a;Fastj…

查看.bin二進制文件的方式(HxD十六進制編輯器的安裝)

文章目錄Windows 系統上安裝 HxD 十六進制編輯器的步驟。**HxD 是一款免費、輕量級的工具&#xff0c;適合查看和編輯 .bin 等二進制文件。****PS:實際安裝過程中會發現找不到Windows11的版本&#xff0c;安裝windows10的即可&#xff0c;并且沒有區別setup版和portable版**安裝…

Linux系統性能優化與監控

系統性能優化與監控是保障 Linux 服務器穩定運行的核心技術&#xff0c;涉及 ??CPU、內存、磁盤 I/O、網絡、進程?? 等多維度的指標分析、問題定位與優化策略。以下從??監控工具與指標??、??常見問題診斷??、??優化方法??三個層面詳細講解&#xff0c;并結合?…

如何在 React + TypeScript 中實現 JSON 格式化功能

如何在 React TypeScript 中實現 JSON 格式化功能 作為前端開發者&#xff0c;我們經常需要處理 JSON 數據。無論是 API 調試、配置文件編輯還是數據轉換&#xff0c;能夠格式化 JSON 是一項基本但非常有用的技能。本文將詳細介紹如何在 React 和 TypeScript 環境中實現 JSON…

Mac連接服務器Docker容器全攻略

蘋果電腦( macOS 系統 )連接服務器、配置容器,整體思路和 Linux 終端操作更貼近,以下結合 macOS 特點,詳細分步說明,以 Docker 容器 + 常見 Linux 服務器( 如 CentOS、Ubuntu )為例: 一、連接服務器(SSH 方式, macOS 終端原生支持 ) 1. 準備信息 找運維或云平臺…

【字節跳動】數據挖掘面試題0019:帶貨直播間推薦:現在有一個帶貨的直播間,怎么把它精準地推送給有需要的用戶

文章大綱 帶貨直播間推薦系統:原理、算法與實踐 一、推薦系統在帶貨直播中的重要性 二、數據收集與處理 1. 用戶數據 2. 直播間數據 3. 用戶行為數據 4. 數據處理與特征工程 三、推薦算法實現 1. 基于內容的推薦 2. 基于協同過濾的推薦 3. 基于知識圖譜的推薦 4. 混合推薦算法…

Windows10筆記本電腦開啟BIOS

文章目錄什么是BIOS一、方案一&#xff1a;快捷鍵進入二、方案二&#xff08;推薦&#xff09;各品牌快捷鍵大全什么是BIOS BIOS 全拼為 BasicInputOutputSystem, 即基本輸入/輸出系統,是計算機中非常基礎而且重要的程序。把這一段程序存放在一個不需要電源的記憶體(芯片)中,就…

NFS、iSCSI 和lnmp部署操作

目錄 &#xff08;一&#xff09;基礎配置 1.NFS服務安裝 2.修改配置文件 3.重載配置文件 4.查看共享目錄 5.客戶端掛載 6.更換共享目錄 7.基礎實驗 &#xff08;二&#xff09;布置lnmp平臺 1.php 安裝軟件 檢測 2.連接MySQL 測試 3.軟件實施 軟件安裝配置 &…