目錄
一、makedile的概述
1、案例引入
2、makefile?
3、Makefile優(yōu)點(diǎn)
二、makefile的語(yǔ)法規(guī)則?
1、語(yǔ)法規(guī)則
2、簡(jiǎn)單實(shí)戰(zhàn)
三、makefile的變量
1、自定義變量
2、系統(tǒng)環(huán)境變量
3、預(yù)定義變量
4、高級(jí)makefile
一、makefile的概述
1、案例引入
gcc a.c b.c c.c ‐o main
如果只修改了b.c 使用gcc編譯 需要對(duì)所有文件重新編譯。makefile可避免此問(wèn)題.
2、makefile?
make 是個(gè)命令,是個(gè)可執(zhí)行程序,用來(lái)解析 Makefile 文件的命令。
makefile 是個(gè)文件,這個(gè)文件中描述了程序的編譯規(guī)則。
3、Makefile優(yōu)點(diǎn)
? ? ? ? (1)簡(jiǎn)化編譯程序的時(shí)候輸入得命令,編譯的時(shí)候只需要敲 make 命令就可以了
? ? ? ? (2)可以節(jié)省第二次編譯時(shí)間,提高編譯效率
二、makefile的語(yǔ)法規(guī)則?
1、語(yǔ)法規(guī)則
目標(biāo)文件名:依賴文件(建立關(guān)系)
<Tab>命令列表
目標(biāo)文件:就是需要生成的文件(可執(zhí)行文件、其他obj文件或動(dòng)作名稱)
依賴文件:通過(guò)依賴文件 生成 目標(biāo)文件(通常有幾個(gè)依賴文件)
命令列表:實(shí)現(xiàn) 將依賴文件 生成 目標(biāo)文件(多個(gè)命令時(shí),每個(gè)命令占一行)
以gcc a.c b.c c.c -o main編譯三個(gè)文件為例:
語(yǔ)法實(shí)例:
main:a.c b.c c.c
????????gcc a.c b.c c.c ‐o main
2、簡(jiǎn)單實(shí)戰(zhàn)
(1)創(chuàng)建并編寫test.c文件
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("hello world\n");
return 0;
}
(2)創(chuàng)建并編寫makefile文件
main:test.c
gcc test.c ‐o main
(3)最后在linux終端輸入命令make即可編譯test.c文件
make 默認(rèn)在工作目錄中尋找名為 GNUmakefile、makefile、Makefile 的文件作為輸入文件
make -f 自定義makefle文件名將自定義文件名的文件作為輸入文件
make 默認(rèn)會(huì)實(shí)現(xiàn) makefile 文件內(nèi)的第一個(gè)目標(biāo)。 make 目標(biāo)文件名 ----->選擇目標(biāo)執(zhí)行。
多個(gè)目標(biāo)時(shí),命令make 目標(biāo)文件名:另一目標(biāo)文件名 ----->選擇多個(gè)目標(biāo)執(zhí)行。
3、較復(fù)雜實(shí)戰(zhàn)
(1)創(chuàng)建并編寫fun.c
int my_add(int x, int y)
{
return x+y;
}
int my_sub(int x, int y)
{
return x-y;
}
int my_mul(int x, int y)
{
return x*y;
}
int my_div(int x, int y)
{
return x/y;
}
(2)創(chuàng)建并編寫fun.h
#ifndef __FUN_H__
#define __FUN_H__
extern int my_add(int x, int y);
extern int my_sub(int x, int y);
extern int my_mul(int x, int y);
extern int my_div(int x, int y);
#endif
(2)創(chuàng)建并編寫main.c
#include <stdio.h>
#include "fun.h"
int main(int argc, char const *argv[])
{
printf("%d\n", my_add(10, 20));
printf("%d\n", my_sub(10, 20));
printf("%d\n", my_mul(10, 20));
printf("%d\n", my_div(10, 20));
return 0;
}
(3)創(chuàng)建并編寫makefile
main:main.o fun.o
gcc main.o fun.o -o main
main.o:main.c
gcc -c main.c -o main.o
fun.o:fun.c
gcc -c fun.c -o fun.o
clean:
rm *.o main
程序流程:當(dāng)要執(zhí)行第一個(gè)目標(biāo)時(shí)沒(méi)有找到main.o和fun.o,會(huì)往下尋找生成main.o和fun.o的指令,執(zhí)行完生成main.o和fun.o的指令后才返回執(zhí)行第一個(gè)指令。
問(wèn)題:.o過(guò)多時(shí)相應(yīng)的指令變多,可以利用makefile的變量?jī)?yōu)化
三、makefile的變量
1、自定義變量
makefile變量類似于C語(yǔ)言中的宏,變量名可以數(shù)字開頭,大小寫敏感,一般在頭部定義。
變量名=變量值
取變量值:$(變量名)或${變量s
以二中較復(fù)雜實(shí)戰(zhàn)為例做自定義修改:
//自定義變量
cc=gcc
exec=main
obj=main.o fun.o
//用自定義變量做部分修改
$(exec):$(obj)
$(cc) $(obj) ‐o $(exec)
main.o:main.c
$(cc) ‐c main.c ‐o main.o
fun.o:fun.c
$(cc) ‐c fun.c ‐o fun.o
clean:
rm *.o $(exec)
2、系統(tǒng)環(huán)境變量
make工具解析makefile前,讀取系統(tǒng)環(huán)境變量并設(shè)置為makefile的變量。
linux下查看環(huán)境變量命令:env
linux下添加系統(tǒng)環(huán)境變量命令:export 要添加的變量名=變量值,舉例:export cc=gcc.
3、預(yù)定義變量
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-615171.html
4、高級(jí)makefile
以優(yōu)化二中較復(fù)雜實(shí)戰(zhàn)為例:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-615171.html
//自定義變量
cc=gcc
exec=main
obj=main.o fun.o
flags=‐Wall
//用自定義變量和預(yù)定義變量修改優(yōu)化
$(exec):$(obj)
$(cc) $^ ‐o $@ $(flags)
%.o:%.c//此時(shí)只需一條語(yǔ)句即可完成多條編譯語(yǔ)句
$(cc) ‐c $< ‐o $@ $(flags)
clean:
rm $(obj) $(exec)
到了這里,關(guān)于【C語(yǔ)言】嵌入式C語(yǔ)言項(xiàng)目管理利器:深入理解Makefile的應(yīng)用與實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!