創作不易,本篇文章如果幫助到了你,還請點贊 關注支持一下?>𖥦<)!!
主頁專欄有更多知識,如有疑問歡迎大家指正討論,共同進步!
🔥c++系列專欄:C/C++零基礎到精通 🔥給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
c語言內容💖:
專欄:c語言之路重點知識整合
【c語言】全部知識點總結
目錄
- Makefile 介紹:
- 源代碼的編譯過程
- Makefile 的基本語法:
- 示例
Makefile 介紹:
Makefile 是被用于自動化構建過程的腳本文件,對一個項目具有高可用性和可重用性。
Makefile 描述了如何從一個或多個源文件編譯、鏈接和生成目標文件或可執行文件。
可以通過使用 make
命令方便地編譯和重新編譯項目,而無需手動執行每個構建步驟。
源代碼的編譯過程
在我們編寫完代碼之后的.c文件被稱為源代碼文件,此時是代碼的預處理期。
- 編譯期:在我們按下調試鍵后,編譯軟件中的編譯器會將我們的源代碼進行編譯,成為匯編語言,如果我們在書寫代碼中有語法等錯誤,在編譯時編譯器將不會通過,會報出以C為開頭的錯誤(編譯:compile)即為編譯錯誤。
- 匯編期:在經過匯編期后,匯編語言會由匯編器轉化為真正的機器語言即01指令,生成.obj文件(目標文件),通過對代碼調試反匯編可以看到,我們的一句代碼在機器語言中對應了很多行的機器語言。
- 連接期:通過連接器計算機將一些.obj文件整合到一起,通過頭文件(庫函數)連接到一起,打包組成了最終的exe可執行文件。如果出現了LNK錯誤即是連接期出現了問題,可能是main函數出現錯誤(一個項目沒有或者有多個main函數)或者缺少頭文件。執行期即執行該exe文件。
Makefile 的基本語法:
Makefile 一般包含:
-
顯式規則:顯式規則說明如何生成一個或多個的目標文件。明顯指出要生成的文件,文件的依賴文件,生成的命令。 TARGET 變量定義了最終生成的可執行文件的名稱。
-
變量定義:在 Makefile 中可以定義一系列的變量,變量一般都是字符串,當 Makefile 被執行時,變量的值會被擴展到相應的引用位置上。
-
文件指示:其包括了三個部分,一個是在一個 Makefile 中引用另一個 Makefile,就像 C 語言中的 include 一樣;另一個是指根據某些情況指定 Makefile 中的有效部分,就像 C 語言中的預編譯#if 一樣;還有就是定義一個多行的命令。
-
注釋:Makefile 中只有行注釋,和 UNIX 的 Shell 腳本一樣,使用“#”字符
-
CC 變量定義了要使用的編譯器(在這里是 gcc)。
-
SRCS 變量包含所有的源文件,OBJS 變量則是從 SRCS 變量中的 .c 擴展名替換為 .o 得到的,代表目標文件。
-
all 是默認目標,當運行 make 命令時,它會首先嘗試構建這個目標。all 依賴于 $(TARGET),即它會嘗試構建可執行文件。
-
$(TARGET): $(OBJS) 描述了如何從目標文件生成可執行文件。使用了 $(CC) 變量定義的編譯器,并將所有的目標文件鏈接起來生成可執行文件。
-
%.o: %.c 描述了如何從 C 源文件編譯生成目標文件。 < 代表依賴項(源文件), < 代表依賴項(源文件), <代表依賴項(源文件),@ 代表目標(目標文件)。
-
clean 目標是一個常用的清理規則,用于刪除生成的目標文件和可執行文件。使用 make clean 命令執行
示例
main.c 生成可執行文件 app 的 makefile 文件示例:
# 定義gcc編譯器
CC=gcc # 定義源文件和目標文件
SRCS=main.c
OBJS=$(SRCS:.c=.o)
TARGET=app# 默認目標:all
all: $(TARGET)
# 鏈接目標文件以生成可執行文件
$(TARGET): $(OBJS) $(CC) $(OBJS) -o $(TARGET)
# 從源文件編譯生成目標文件
%.o: %.c $(CC) -c $< -o $@
# 清除生成的目標文件和可執行文件
clean: rm -f $(OBJS) $(TARGET)
CC=gcc
CFLAGS=-Wall -g # 添加編譯選項 # 使用通配符獲取所有.c文件
CFILES=$(wildcard *.c)
OBJS=$(CFILES:.c=.o) # 默認目標:all
all: app # 鏈接目標文件以生成可執行文件
app: $(OBJS) $(CC) $(CFLAGS) -o app $(OBJS) # 從源文件編譯生成目標文件
%.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清除生成的目標文件和可執行文件
clean: rm -rf hello *.o
大家的點贊、收藏、關注將是我更新的最大動力! 歡迎留言或私信建議或問題。 |
大家的支持和反饋對我來說意義重大,我會繼續不斷努力提供有價值的內容!如果本文哪里有錯誤的地方還請大家多多指出(●'?'●) |