【Linux】使用Makefile自動化編譯項目:簡化開發流程、提高效率

文章目錄

  • 示例一:編譯一個進度條程序
  • 示例二:編譯一個簡單的程序
  • gcc的幾個選項
  • 結論

當你開始一個新的軟件項目時,編寫一個好的Makefile是非常重要的。Makefile是一個文本文件,用于指定如何構建和編譯項目。它定義了目標文件、依賴關系以及編譯命令等。在本文中,我們將通過兩個示例Makefile來說明如何編寫一個簡單但功能強大的Makefile。

示例一:編譯一個進度條程序

讓我們首先看一下如何編寫一個用于編譯進度條程序的Makefile。假設我們有兩個源文件main.cprocessbar.c,以及對應的頭文件。以下是示例的Makefile:

# 用于編譯進度條程序的Makefile示例# 定義目標文件和它的依賴關系,并設置鏈接規則
processbar: main.o processbar.ogcc -o $@ $^# 編譯main.c為main.o的規則
main.o: main.cgcc -c main.c# 編譯processbar.c為processbar.o的規則
processbar.o: processbar.cgcc -c processbar.c# 定義偽目標clean,并設置刪除目標文件和可執行文件的規則
.PHONY: clean
clean:rm -f main.o processbar.o processbar

在這個示例中,我們使用了一些常見的Makefile規則。首先,我們定義了目標文件processbar和它的依賴關系main.oprocessbar.o。通過gcc -o $@ $^命令,我們將這些目標文件鏈接成可執行文件processbar。

接下來,我們定義了兩個規則來編譯源文件。main.o的規則使用gcc -c main.c命令將main.c編譯成目標文件。同樣地,processbar.o的規則使用gcc -c processbar.c命令將processbar.c編譯成目標文件。

最后,我們定義了一個偽目標clean,它用于清除生成的目標文件和可執行文件。通過rm -f main.o processbar.o processbar命令,我們可以刪除這些文件。

示例二:編譯一個簡單的程序

現在我們來看另一個示例,展示如何編寫一個用于編譯簡單程序的Makefile。假設我們有一個源文件mytest.c,以下是對應的Makefile示例:

# 用于編譯簡單程序的Makefile示例# 定義目標文件和它的依賴關系,并設置鏈接規則
mybin: mytest.ogcc -o mybin mytest.o# 編譯mytest.s為mytest.o的規則
mytest.o: mytest.sgcc -c -o mytest.o mytest.s# 匯編mytest.i為mytest.s的規則
mytest.s: mytest.igcc -S -o mytest.s mytest.i# 預處理mytest.c為mytest.i的規則
mytest.i: mytest.cgcc -E -o mytest.i mytest.c# 定義偽目標clean,并設置刪除生成文件的規則
.PHONY: clean
clean:rm -f mytest.s mytest.i mytest.o mybin

在這個示例中,我們同樣使用了一些常見的Makefile規則。我們定義了目標文件mybin和它的依賴關系mytest.o。通過gcc -o mybin mytest.o命令,我們將mytest.o鏈接成可執行文件mybin

接下來,我們定義了三個規則來編譯不同的源文件。mytest.o的規則使用gcc -c -o mytest.o mytest.s命令將匯編文件mytest.s編譯成目標文件。mytest.s的規則使用gcc -S -o mytest.s mytest.i命令將預處理文件mytest.i匯編成匯編文件。mytest.i的規則使用gcc -E -o mytest.i mytest.c命令將源文件mytest.c預處理成預處理文件。

最后,我們同樣定義了一個偽目標clean來清除生成的文件。

gcc的幾個選項

gcc是一個C語言編譯器,在Makefile中經常被用來編譯源文件。下面是gcc編譯器常用的幾個選項及其含義:

  • -c:只編譯源文件,生成目標文件,不進行鏈接。
  • -o:指定輸出文件的名稱。
  • -S:只進行編譯和匯編,生成匯編代碼文件,不進行鏈接。
  • -E:只進行預處理,把預處理后的代碼輸出到標準輸出,不進行編譯、匯編和鏈接。
  • -Wall:啟用所有警告信息。
  • -Werror:將所有警告當作錯誤來處理。
  • -g:為調試生成額外的符號信息。
    這些選項可以在Makefile中被用來編譯和構建項目,例如:
 # 編譯main.c為main.o的規則
main.o: main.cgcc -c -o main.o main.c# 匯編mytest.i為mytest.s的規則
mytest.s: mytest.igcc -S -o mytest.s mytest.i

在上述示例中,-c選項表示只編譯源文件,而不進行鏈接;-o選項指定輸出文件名為main.omytest.s-S選項表示只進行編譯和匯編,生成匯編代碼文件;-E選項表示只進行預處理;-g選項表示為調試生成額外的符號信息。-Wall-Werror選項用于啟用所有警告信息并將其視為錯誤,可以幫助我們更好地發現代碼中的潛在問題和錯誤。

結論

通過這兩個示例Makefile,我們展示了如何編寫一個簡單但功能強大的Makefile來編譯程序。Makefile使得構建和編譯項目變得更加自動化和簡化,提高了開發效率。通過定義目標文件、依賴關系以及編譯命令等規則,我們可以輕松地構建和維護復雜的項目。希望這篇博客對你編寫Makefile有所幫助!

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

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

相關文章

8年老鳥整理,自動化測試-準備測試數據詳細...

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 大部分類型的測試…

基于C#實現Bitmap算法

在所有具有性能優化的數據結構中,我想大家使用最多的就是 hash 表,是的,在具有定位查找上具有 O(1)的常量時間,多么的簡潔優美,但是在特定的場合下: ①:對 10 億個不重復的整數進行排序。 ②&am…

python獲取透明圖

import cv2 import os import numpy as nproot "./test" for file in os.listdir(root):# 讀取圖片image cv2.imread(os.path.join(root, file), cv2.IMREAD_UNCHANGED)new np.zeros((image.shape[0], image.shape[1], image.shape[2]), np.uint8)# 檢查圖片是否為…

AI原生應用為百度帶來新增量

我是盧松松,點點上面的頭像,歡迎關注我哦! AI將徹底改變每一個行業!得益于AI和基礎模型的驅動,百度在AI原生應用領域厚積薄發。 11月21日,百度Q3財報發布,數據顯示:三季度營收達344.47億元&…

Redis篇---第九篇

系列文章目錄 文章目錄 系列文章目錄前言一、如果有大量的 key 需要設置同一時間過期,一般需要注意什么?二、什么情況下可能會導致 Redis 阻塞?三、緩存和數據庫誰先更新呢?前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊…

Axios簡單使用與配置安裝-Vue

安裝Axios npm i axios main.js 導入 import Axios from axios Vue.prototype.$axios Axios簡單發送請求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//請求成功回調console.log(res)}…

uiautomator2快速入門app自動化測試教程

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、環境準備1.安裝軟件2.安裝庫 二、adb 連接手機1. 準備工作2. 第一種連接方式:USB連接3. 第二種連接方式:WLAN連接4. 第三種連接方式…

②⑩ 【MySQL Log】詳解MySQL日志:錯誤日志、二進制日志、查詢日志、慢查詢日志

個人簡介:Java領域新星創作者;阿里云技術博主、星級博主、專家博主;正在Java學習的路上摸爬滾打,記錄學習的過程~ 個人主頁:.29.的博客 學習社區:進去逛一逛~ MySQL日志 ②⑩ MySQL日志:錯誤日志…

SpringBoot3.x最簡集成SpringDoc-OpenApi

為什么使用SpringDoc 在SpringBoot低版本時一般使用Swagger掃描接口生成Json格式的在線文檔,然后通過swagger-ui將Json格式的文檔以頁面形式展示文檔。可惜遺憾的是swagger更新到3.0.0版本(springfox)后不更新了。 SpringBoot3.x以后需要的JDK版本最低為Java17&…

MQ和redis的內部原理一些總結

首先,先知道內部原理;其次,就是查官方文檔實戰了。 但是如果不熟悉內部原理,那么僅僅只是安裝官方文檔,并不能排除跟蹤問題和故障、預防風險等策略; 以下總結圖解:(mysql 8.0新增的…

YOLO目標檢測——衛星遙感艦船檢測數據集下載分享【含對應voc、coco和yolo三種格式標簽】

實際項目應用:衛星遙感艦船檢測數據集說明:衛星遙感艦船檢測數據集,真實場景的高質量圖片數據,數據場景豐富,含船一個類別標簽說明:使用lableimg標注軟件標注,標注框質量高,含voc(xm…

Redis的持久化

redis是一個內存數據庫,是把數據存儲在內存中的,而我們知道內存中的數據是不持久的,一旦服務器重啟或者進程重啟,內存的數據就丟失了.為了讓數據達到持久化的效果,就必須把數據寫到硬盤上. redis相對于mysql這樣的關系型數據庫最明顯的優勢就是快.所以為了保證速度快,數據還得…

動態跳過測試用例

動態跳過測試用例 說明 我們可以通過指定環境變量來動態判斷是否執行指定的測試用例設置環境變量有很多種方法,例如命令行方式,格式:--env keyval1,key2val2 ,若需要指定多個環境變量則需要逗號來隔開,而不是空格 t…

Live800:企業提升客戶互動體驗,有哪些關鍵因素?

如今,隨著信息時代的不斷發展,企業已經不再是單向的商業機構,他們需要與客戶進行及時的溝通與反饋,從而更好地提升客戶互動體驗,達到營銷和用戶體驗的雙贏局面。那么,企業如何提升客戶互動體驗呢&#xff1…

設計模式——RBAC 模型詳解

1.什么是 RBAC 呢? RBAC 即基于角色的權限訪問控制(Role-Based Access Control)。這是一種通過角色關聯權限,角色同時又關聯用戶的授權方式。 簡單地說:一個用戶可以擁有若干角色,每一個角色又可以被分配…

Mysql 中如何導出數據?

文章目錄 前言MySQL 導出數據使用 SELECT ... INTO OUTFILE 語句導出數據SELECT ... INTO OUTFILE 語句有以下屬性:導出表作為原始數據導出SQL格式的數據將數據表及數據庫拷貝至其他主機 后言 前言 hello world歡迎來到前端的新世界 😜當前文章系列專欄:…

Linux程序之可變參數選項那些事!

一、linux應用程序如何接收參數? 1. argc、argv Linux應用程序執行時,我們往往通過命令行帶入參數給程序,比如 ls /dev/ -l 其中參數 /dev/ 、-l都是作為參數傳遞給命令 ls 應用程序又是如何接收這些參數的? 通常應用程序都…

Raspberry Pi 5 新一代單板計算機:樹莓派5代 (介紹、入門、解疑)

樹莓派5代正式發布后,硬件和性能的全面升級讓眾多開發者們都想入手感受一波,外觀上Raspberry Pi 5 與前代產品非常相似,不過,在保留信用卡大小的整體尺寸的同時,也更新了一些設計元素,以適應新芯片組的功能…

python實現調和反距離空間插值法AIDW

1 簡介 AIDW 主要是針對 IDW 的缺點進行了改進,考慮了樣本點與預測點的位置,即方向和距離,具體見下圖: 2 改進 IDW 公式: 從IDW算法可看出,插值點的估算值僅與插值樣本距插值點的遠近相關,并未…