GCC/G++ + Makefile/make 使用

一、gcc\g++編譯器

什么是gcc和g++,它們的區別又是什么?
gcc編譯器是專門用來編譯C語言的,而g++編譯器既可以編譯C語言又可以用來編譯C++,但是主要還是用來編譯C++。
我們都知道代碼形成可執行程序都是需要經過預處理、編譯、匯編和鏈接這四個過程的,既然如此上述我們看到的兩個編譯器也必然是要圍繞著這四個過程來進行說明。

1、預處理

預處理是做是什么工作的?

頭文件展開、宏替換、去掉注釋和條件編譯

我們在linux中輸入什么指令可以看見預處理這個階段呢?

filename.c為要編輯的文件名
gcc -E filename.c 將預處理后的內容打印到顯示屏上
gcc -E filename.c -o test.c 將預處理后的內容寫到test.c文件里

什么是頭文件展開呢?

頭文件展開其實就是把頭文件中相關的內容拷貝到源文件中,也就是說當預處理完成后我們其實就可以不用頭文件了

什么是裁剪?我們又怎么理解裁剪呢?

裁剪其實就是對代碼進行增、刪和改操作。在預處理階段,我們會發現代碼從原來的幾行一下子變成了幾百行,這其實就是將頭文件里面的內容拷貝到了源文件中了這里就是增,之后去掉注釋這里就是刪,最后根據條件可以修改代碼這就是改。

2、編譯

實現編譯的操作

gcc -S filename.c -o test.c 對預處理階段的文件進行編譯

在這里插入圖片描述
我們可以看到當我們輸入上述指令后,會形成一堆我們看不懂的東西,而這個東西是什么呢?其實就是匯編語言

3、匯編

實現匯編操作

gcc -c filename.c -o test.c 對test.c進行匯編

經過上面的編譯生成的匯編,而這里的匯編是生成可執行程序當中的一個階段。它其實就是將匯編語言翻譯成可重定位目標二進制文件。這里我們就有疑問了,既然它是翻譯成二進制文件,是不是到這里我們計算機就可以識別了呢?并不是我們可以嘗試使用./test.c來運行這個程序
在這里插入圖片描述
我們發現直接就是報錯了,這是為什么呢?我們接著往下看。

4、鏈接

實現鏈接的操作

gcc filename.c -o test.c

上面的匯編形成的可重定位二進制文件并不是一個可執行程序,它必須要經過鏈接才能生成可執行程序。這又是為什么呢?

比如在編程時,我們經常使用現成的庫函數,而不必每次都重新編寫所有功能代碼,只需聲明即可調用。同樣,匯編生成的可重定位二進制文件也需要與庫函數鏈接,才能最終生成可執行程序文件。

那么什么是鏈接呢?

在代碼編譯階段,庫函數的實際地址尚未確定,因為這些函數的具體實現位于庫文件中。當進行鏈接時,鏈接器會將目標文件(.o)與庫文件合并,在此過程中會解析并填充庫函數在目標文件中的調用地址,最終生成完整的可執行文件。

為什么要有庫?

使用庫的主要目的是提升開發效率。在日常開發中,我們經常需要重復使用某些功能函數。如果每個開發者都自行編寫這些基礎功能,會造成大量重復勞動和時間浪費。

如何理解庫呢?

庫的常見分類有兩種:靜態庫和動態庫
在windows中后綴分別是:.lib 和 .dll
在linux中后綴分別是:.a 和 .so

動態鏈接:與動態庫鏈接

在這里插入圖片描述
靜態鏈接:與靜態庫鏈接
在這里插入圖片描述

注意:
靜態鏈接有可能會失敗,原因是因為系統中可能沒有默認安裝C\C++的靜態庫。編譯器默認采用動態鏈接的方式,形成可執行程序。

什么是動態鏈接?

動態鏈接就是程序還未加載到內存的時候,就已經和動態庫建立了信息上的鏈接,執行到庫函數的時候,跳轉到動態庫執行,然后繼續執行自己的代碼

優點:節省資源
缺點:一旦丟失所有的程序都將無法運行

什么是靜態庫?

一組編譯好的代碼和數據的集合,它們在編譯期間被鏈接到應用程序中

優點:不依賴任何庫,自己獨立就能運行
缺點:體積大,占據資源多,加載速度受影響

二、自動化構建make\Makedife

1、基本概念

make是一個linux系統內置的命令
Makefile是一個需要自己創建的文件
make命令會在當前目錄下尋找makefile文件,解析里面的內容

2、操作步驟

(1)創建makefile文件

在這里插入圖片描述

(2)編寫makefile文件

在這里插入圖片描述

在這里插入圖片描述

(3)make指令運行代碼

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3、makefile

在這里插入圖片描述
這里我們會有很多的疑問。
為什么make的時候只執行了第一個目標呢?

這是因為make,makefile默認只形成一個目標,就是從上往下遇到的第一個目標

什么是偽目標?

.PHONY:表示被修飾的目標是一個偽目標
特點:偽目標總是被執行的。

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

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

相關文章

重復文件查找工具:DataSecurity Plus 全面提升企業文件管理效率

企業日常運營經常會出現這樣的場景:員工在文件傳輸、共享與備份過程中,因操作不當或系統設置問題,出現文件重復存儲;跨部門協作時,相同的項目資料可能被多次保存;隨著數據遷移與系統升級,重復文…

【軟件架構】資源池架構設計中的三種主流模式

在資源池架構設計中,三種主流模式——集中式、分布式和混合式資源池——各有其獨特的優勢、劣勢和適用場景。理解它們的區別對于設計高效、可靠和可擴展的系統至關重要。 下面是對這三種模式的詳細分析和比較:集中式資源池 核心概念: 將所有計…

Java 類加載沖突

在某次線上部署過程中,我們遇到了一個十分詭異的問題:同樣的應用,在 ext3 文件系統下運行正常,但部署到 ext4 文件系統下卻出現了如下異常:The methods class, com.ctc.wstx.io.StreamBootstrapper, is available from…

VMware安裝 統信UOS桌面專業版

前言 近年來,隨著Linux發行版在開發者、企業環境中的應用逐漸增多,國產操作系統統信UOS(基于Debian)因其良好的圖形化界面和本地化支持,成為不少用戶體驗Linux生態的選擇之一。本文將以VMware Workstation Pro 17為例…

SAP Datasphere 02 - 建模

創建連接創建到 HANA Cloud 實例的連接查看 HANA Cloud實例連接 Endpoint創建連接選擇連接類型配置連接信息,授權方式,用戶名密碼等配置連接名稱驗證連接導入數據源表創建目錄 Hotel ,放置建模對象點擊新建目錄,導入遠程表選擇數據…

isasssim robotiq夾爪踩坑

1. usd導出urdf失敗在isasssim的仿真中的 robotiq 2f夾爪,首先目前4.5asset里面的usd不能直接轉urdf,因為模型中存在 “閉環連接”,即某個部件(或關節)同時與兩個及以上的父部件相連,形成類似 “三角形” 的…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Pokedex(寶可夢圖鑒)

📅 我們繼續 50 個小項目挑戰!—— Pokedex組件 倉庫地址:https://github.com/SunACong/50-vue-projects 項目預覽地址:https://50-vue-projects.vercel.app/ 使用 Vue 3 結合 PokeAPI 來創建一個炫酷的寶可夢圖鑒應用。通過這個…

【Practical Business English Oral Scene Interpretation】在職主持會議-安排任務+結束會議

文章目錄Introduction1. 討論代辦事項2. 分配工作任務3. 說明截止日期4. 說明截止日期5. 感謝參會者Introduction Note that each row of the table represents the content of the conversation in order. 1. 討論代辦事項 AlexBarryNoteLet’s review the to-dos from the…

ansible簡單playbook劇本例子

1. 創建主機清單vim inventory.ini192.168.100.181[web:vars] ansible_userroot ansible_passwordAdmin123456[web] 192.168.100.1822. 創建一個簡單的劇本vim playbook.yaml- name: My first playhosts: webtasks:- name: Ping my hostsansible.builtin.ping:- name: Print me…

愛心煙花浪漫立方體輪播圖 - 用代碼表達愛意

項目介紹 這是一個專為表白和營造浪漫氛圍而設計的3D立方體輪播圖結合了現代Web技術與浪漫元素,通過立方體的旋轉展示珍貴的照片,同時配有愛心飄動、流星劃過、煙花綻放和雪花飛舞等浪漫特效,為你的表白增添獨特的科技浪漫。 效果展示截圖原…

基于人工智能的無人機網絡系統

目錄 1.環境感知與目標檢測 2.無人機定位與導航(SLAM與路徑規劃) 3.無人機網絡通信與資源優化 4.無人機集群協同控制(一致性與編隊) 5.無人機任務分配與調度(組合優化) 6.MATLAB仿真測試 基于人工智能…

nginx安裝配置Lua模塊的支持

一、先來看幾個概念問題1.1 為什么需要?nginx官方自帶了非常多的核心模塊,再加上第三方的模塊能夠滿足我們大部分的業務需要,但是業務的需求、業務的場景變化需要添加一些額外的功能,如果自己去開發一個nginx模塊相對來說比較笨重…

智慧礦山低光照識別準確率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構引用自《陌訊技術白皮書》,禁止未經授權的轉載與商用。一、行業痛點:智慧礦山的視覺識別困境礦山場景的視覺監控一直面臨多重技術挑戰:井下巷道長期處于低光照環境(光照…

AI賦能操作系統:通往智能運維的未來

一、具備AI能力的操作系統未來的操作系統如果具備了AI能力,那將徹底改變我們管理和保護服務器的方式。一旦AI能力被充分集成并啟用,自動優化、安全檢測和漏洞修復的潛力將變得無比巨大且切實可行。想象一下未來的服務器管理:不再需要人工夜以…

sqli-labs:Less-13關卡詳細解析

1. 思路🚀 本關的SQL語句為: $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型:字符串型(單引號、括號包裹)、POST請求提示:參數…

微軟發布Microsoft Sentinel數據湖國際版

在網絡安全威脅持續升級的背景下,微軟宣布推出Microsoft Sentinel數據湖(國際版),以突破性架構重塑企業安全運營能力。該產品目前已進入公開預覽階段,標志著安全信息與事件管理(SIEM)領域正式邁…

力扣面試150題--只出現一次的數字II

Day 92 題目描述思路 初次思路:想不出來 哈哈哈指揮hash 就不放出來丟人了 題解思路:這個做法是每次確定一個位是否為答案為1 的位 具體是這樣的:由于除了答案外每個數字都會出現3次,那么我們不考慮答案的情況,那么一個…

cacti的RCE

一、環境搭建 1、安裝docker curl -fsSL https://get.docker.com | sh 驗證docker是否正確安裝 docker version 驗證docker compose是否可用 docker compose version 2、在GitHub上拉取 vulhub 首先先裝一個proxychains網絡代理工具,如果直接拉取的話速度會…

Spark SQL 的 SQL 模式和 DSL模式

下面我將詳細講解如何使用 Spark SQL 分別通過 SQL 模式和 DSL(Domain Specific Language)模式實現 WordCount 功能。WordCount 是大數據處理中的經典案例,主要功能是統計文本中每個單詞出現的次數。準備工作首先需要初始化 SparkSession&…

03 基于sklearn的機械學習-線性回歸、損失函數及其推導

線性回歸 分類的目標變量是標稱型數據,回歸是對連續型的數據做出預測。 一、標稱型數據(Nominal Data) 標稱型數據屬于分類數據(Categorical Data) 的一種,用于描述事物的類別或屬性,沒有順序或…