什么是Makefile文件
- 一個工程,源文件不計其數,按照類型、功能、模塊分別放在對應的若干個目錄中
- Makefile定義了一系列的規則,比如定義文件編譯的先后順序。類似shell腳本,也可以執行操作系統的命令
- Makefile帶來的好處是自動化編譯
- 文件的命名 makefile 或者 Makefile
- Makefile規則 :其可以定義一個或者多個 規則
- 目標 ... :? 依賴? ...
- 目標:最終要生成的文件 (偽目標除外)
- 依賴:生成目標所需要的文件或者是目標
- 命令:通過執行命令對依賴生成目標 (命令之前使用 Tab進行縮進)
工作原理
- 命令在執行之前,需要檢查規則中依賴是否存在
- 如果存在:執行命令
- 如果不存在:向下檢查其他的規則,檢查有沒有一個規則是用來生成這個依賴的,如果找到,就執行規則中的命令
- 檢測更新,在執行規則中的命令時,會比較目標和依賴文件的時間
- 如果依賴的時間比目標時間晚,需要重新生成目標
- 如果依賴的時間比目標時間早,目標不需要更新,對應規則中的命令不需要被執行
app:sub.o add.o mult.o main.ogcc sub.o add.o mult.o main.osub.o:sub.cgcc -c sub.c -o sub.oadd.o:add.cgcc -c add.c -o add.omult.o:mult.cgcc -c mult.c -o mult.omain.o:main.cgcc -c main.c -o main.o
?內容詳解
- 自定義變量
- 預定義變量
- AR:? 歸檔維護程序的名稱 默認數值為 ar
- CC:C 編譯器的名稱 默認數值為cc
- CXX:C++編譯器的名稱 默認數值為g++
- $@:目標的完整路徑
- $<: 第一個依賴的文件的名稱
- $^ :所有的依賴文件的
- 獲取變量的數值
app:mian.c a.c b.cgcc -c main.c a.c b.capp:main.c a.c b.c$(CC) -c $^ -o $@
app:sub.o add.o mult.o main.ogcc sub.o add.o mult.o main.osub.o:sub.cgcc -c sub.c -o sub.oadd.o:add.cgcc -c add.c -o add.omult.o:mult.cgcc -c mult.c -o mult.omain.o:main.cgcc -c main.c -o main.o模式匹配%.o:%.c% 通配符,匹配一個字符串
%.o:%.cgcc -c $< -o $@
函數
(wildcard PATTERN)
- 功能:獲取指定目錄下指定類型的文件列表
- 參數:PATTERN 指的是某個或者多個目錄下的對應的某種類型的文件,如果有多個目錄,一般使用空格進行間隔
- 返回:得到的若干個文件的文件列表 文件名字之間使用空格進行間隔
例子
$(wildcard *.c ./sub/*.c)返回數值的格式:a.c b.c d.c e.c f.c
$(patsubst <pattern>,<replacement>,<text>)
- ?功能:查找<text>中的單詞(單詞以“空格”、“Tab”或者"回車"、"換行"分隔)是否符合模式<pattern>,如果匹配的話,則用<replacement>替代
- <pattern> 可以包括通配符"%" 表示任意長度的子串。如果<replacement>中 也包含“%s”,那么<replacement>中的這個'%',將是<pattern>中的%所代表的子串
- 使用'\'進行轉義 ,即 \%表示真實含義的%字符
例子
$(patsubst %.c , %.o , x.c bar.c)返回數值的類型 x.o bar.o
刪除 所有的.o 文件
.PHONY:clean //將clean作為偽目標,就不會生成clean文件
clean:rm $(objs) -f
CMakeLists.txt文件的參考鏈接
- CMakeLists模板持續更新中,歡迎補充
- CMakeLists.txt編寫常用命令
- CMake 語法 - 詳解 CMakeLists.txt
- CMakeLists.txt 語法介紹與實例演練
- 【CMake】CMakeLists.txt的超傻瓜手把手教程(附實例源碼)
- Cmake知識----編寫CMakeLists.txt文件編譯C/C++程序