基本規則
makefile的規則,一般由以下組成
目標: 依賴列表
命令列表
1、其中第一條規則中的”目標“,將會成為終極目標。我們最終目的,就是為了生成這個目標的
2、每一個規則中的目標。都可以是一個文件,也可以是一個標簽
3、每一個規則中的目標,不一定要有依賴
目標:
命令列表
此時的目標,我們成為”偽目標“
4、每一個規則,也不一定有命令列表
案例
假設我們有三個.c源文件,main.c、f1.c、f2.c
f1.c
#include "stdio.h"
void f1()
{
printf("This is f1
);}
f2.c
#include "stdio.h"
void f2()
{
printf("This is f2
);}
然后我們在main里面調用f1與f2這兩個函數,接著編譯、運行即可
下面我們編寫一下Makefile
target:main.c f1.c f2.c
gcc f1.c f2.c main.c
輸入命令 make
即可完成編譯
如果不想打印出gcc f1.c f2.c main.c
這條命令,可以在Makefile
文件中的命令列表前加上一個@
符號
變量
創建變量,與shell類似
number = '56',此時,變量number的值就是56,
可以使用echo驗證: echo &$number
其中這個符號$
就是使用已聲明的變量
變量的三種賦值方式
第一種:'=' 稱為”延時展開賦值“
例如:
temp = $number
number = '56'
此時你輸出'temp'等于56,所謂延時展開賦值就是當number成功賦值之后,再把number的值賦給temp
第二種:':='稱為”立即展開賦值“
例如:
temp := $number
number = '56'
此時你輸出'temp'就為空
第三種:'?='稱為條件賦值
例如:
temp ?= $number
假如在這之前沒有給變量temp賦過值,那么就會把number的值賦給temp,反之就不會把number的值賦給temp
特殊變量
$@
: 當前規則中的目標
$^
: 當前規則中的所有依賴
$<
: 當前依賴中的第一個
$$
: 當前執行的進程的進程編號
$*
: 模式規則中的所有%匹配的部分
$?
: 模式規則中所有比所在規則中的目標更 新的文件組成的列表
下面借助變量優化一下上述案例的Makefile
SOURCE=main.c f1.c f2.c
target:$(SOURCE)
gcc $^
模式規則
%.o: %.c
gcc -c $<
%.c
會匹配.c文件前面的部分,相當于shell
中的*.c
模式規則執行時,是一個循環取出的過程,每次取出一個.c
,調用命令生成對應的.o
模式規則舉例
#strat
TARGET = a.out
SRCS = main.c
$(TARGET): $(SRCS:.c = .o)
gcc $^ -o $@
#$(SRCS:.c=.o) 可以理解為目標所依賴文件是由.c文件生成的.o文件
#模式規則
%.o: %.c
gcc -c $< #模式規則每次取出一個,所以這里用$<
#end
寫Makefile系列的文章是做個筆記,為了以后方便復習,里面應該有許多BUG,等學一段時間后會繼續完善
審核編輯:湯梓紅
-
Makefile
+關注
關注
1文章
125瀏覽量
19220
發布評論請先 登錄
相關推薦
linux系統中Makefile的使用方法
關于Makefile自動生成-autotools的使用
![關于<b class='flag-5'>Makefile</b>自動生成-autotools的使用](https://file1.elecfans.com/web2/M00/FE/6C/wKgZomaiA92AdVYPAAA4s4JbHRw593.png)
怎樣去使用Makefile+VCS+Verdi做個簡單的Test Bench?
駕馭Makefile
關于Linux 2.6內核Makefile的分析
linux makefile教程
makefile的基本語法
Makefile是什么?Makefile工作原理是怎樣的?Makefile經典教程免費下載
![<b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎樣的?<b class='flag-5'>Makefile</b>經典教程免費下載](https://file.elecfans.com/web1/M00/63/FB/pIYBAFuY37CAHvUqAAMLYLC7KPc932.png)
Linux關于Makefile的用法介紹
Linux內核的Makefile、Kconfig和.config文件
芯片設計中的Makefile簡單教程
交叉編譯鏈下的Makefile(STM32F4xx)
![交叉編譯鏈下的<b class='flag-5'>Makefile</b>(STM32F4xx)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論