一步一步的写出你自己的makefile文件
使用的makefile 文件的小結(jié)
main:main.o add.o sub.o //生成main可執(zhí)行文件的方式gcc -g main.o add.o sub.o -o main //命令行有TAB 開始//main依賴于 main.o add.o sub.o main.o:main.c //main.o 生成依賴于 main.cgcc -g -c main.c -o main.o // add.o:add.c add.h //add.o的的生成依賴于add.c add.hgcc -g -c add.c -o add.o sub.o:sub.c sub.hgcc -g -c sub.c -o sub.o .PHONY:clean //顯式的生命 clean 是一個(gè)偽目標(biāo) //這樣就算是有一個(gè)文件命名為clean在執(zhí)行make clean的時(shí)候也不會(huì) make: 'clean' is up to date. main:main.o add.o sub.ogcc -g main.o add.o sub.o -o main main.o:main.cgcc -g -c main.c -o main.o add.o:add.c add.hgcc -g -c add.c -o add.o sub.o:sub.c sub.hgcc -g -c sub.c -o sub.oclean:rm -f main main.o add.o sub.omakefile 的自動(dòng)化變量
$@ 規(guī)則的目標(biāo)文件名 $< 規(guī)則的第一個(gè)依賴文件名 $^ 規(guī)則的所有的文件列表下面是使用了自動(dòng)化變量之后的makefile文件的編寫,對(duì)比之前那的可以簡(jiǎn)化很多
.PHONY:clean #在這里說明 clean是一個(gè)偽變量 OBJECTS = main.o add.o sub.o #makefile 中的自定義的變量 main:$(OBJECTS)gcc -g $^ -o $@ # $^依賴文件列表 $@ 目標(biāo) main.o:main.cgcc -g -c $< -o $@ #$<依賴文件列表中的第一個(gè)依賴文件 add.o:add.c add.hgcc -g -c $< -o $@ sub.o:sub.c sub.hgcc -g -c $< -o $@clean:rm -f main $(OBJECTS)當(dāng)一個(gè)文件中有多個(gè)makefie的時(shí)候可以使用
makefile clean -f makefile.1 //這樣就是說使用makefile.1中的說明去執(zhí)行makefile需要執(zhí)行的文件
執(zhí)行的結(jié)果是:
rosfun@ubuntu:~/makefile$ make clean -f makefile.1 echo "begin delete..................." begin delete................... rm -f main main.o add.o sub.o優(yōu)化之后:
.PHONY:clean main:main.o add.o sub.ogcc -g main.o add.o sub.o -o main main.o:main.cgcc -g -c main.c -o main.o add.o:add.c add.hgcc -g -c add.c -o add.o sub.o:sub.c sub.hgcc -g -c sub.c -o sub.oclean:@echo "begin delete..................." #這一句不想被打印出來 加上@ 符號(hào)rm -f main main.o add.o sub.o執(zhí)行結(jié)果
rosfun@ubuntu:~/makefile$ make clean -f makefile.1 begin delete................... rm -f main main.o add.o sub.o rosfun@ubuntu:~/makefile$也就是說在命令行的前面加上@ makefile文件就會(huì)只執(zhí)行相應(yīng)的命令但是不把這一行打印出來
使用makefile 生成兩個(gè)都含有主函數(shù)的.c文件
rosfun@ubuntu:~/makefile/02$ touch 01test.c 02test.c rosfun@ubuntu:~/makefile/02$ ls 01test.c 02test.c rosfun@ubuntu:~/makefile/02$ gedit 01test.c rosfun@ubuntu:~/makefile/02$ gedit 02test.c rosfun@ubuntu:~/makefile/02$ ls 01test.c 02test.c rosfun@ubuntu:~/makefile/02$ gedit makefile rosfun@ubuntu:~/makefile/02$ make cc 01test.c -o 01test cc 02test.c -o 02test rosfun@ubuntu:~/makefile/02$ ./01test hello world rosfun@ubuntu:~/makefile/02$ ./02test 02 rosfun@ubuntu:~/makefile/02$ gedit makefile執(zhí)行的結(jié)果如上:實(shí)現(xiàn)過程和相應(yīng)為makefile文件如下:
.PHONY:clean all BIN=01test 02test #all 也是一個(gè)偽命令 all:$(BIN) #因?yàn)閍ll是一個(gè)偽命令 所以在生成的時(shí)候不會(huì)生成 到時(shí)all的生成是依賴于$(BIN)的生成的要是想生 #成 all就必須先生成 $(BIN) 因?yàn)闆]有給出生成$(BIN)具體方式所以在生成$(BIN)s時(shí)候編譯器會(huì)根據(jù)自己的規(guī)則自動(dòng)的生成相應(yīng)文件在使用gcc 生成可執(zhí)行文件的時(shí)候 不需要使用 -c 說明
如下:
使用makefile 編譯多個(gè)可執(zhí)行文件
記住兩種規(guī)則:
第一節(jié)課的生成多個(gè)可執(zhí)行文件的makefile的編寫方式
增加模式規(guī)則或者后綴規(guī)則之后就可以實(shí)現(xiàn) 下面的這些方式
#生成多個(gè)還要主函數(shù)的文件的 makefile文件 主要是加上 虛擬目標(biāo) .PHONY:all .PHONY:clean all CC=gcc #定義一個(gè)變量用來替換gcc CFLAGS= -g BIN=01test 02test 03test #all 也是一個(gè)偽命令 all:$(BIN) # #%.o:%.c #使用模式規(guī)則 # gcc -g -c $< -o $@ #生成 .o文件要加上 -c說明 .c.o:$(CC) $(CFLAGS) -c $< -o $@ 01test:01test.o$(CC) -g $^ -o $@ #要是生成可執(zhí)行文件 不需要使用 -c 02test:02test.ogcc -g $^ -o $@ 03test:03test.o public.o #新增加的public文件03test可執(zhí)行文件的生成依賴于public文件加上的方式$(CC) $(CFLAGS) $^ -o $@clean:echo "正在清除相應(yīng)的編譯文件!!!!"@echo "正在清除相關(guān)的編譯文件!!!!"rm -f $(BIN)#因?yàn)閍ll是一個(gè)偽命令 所以在生成的時(shí)候不會(huì)生成 到時(shí)all的生成是依賴于$(BIN)的生成的要是想生 #成 all就必須先生成 $(BIN) 因?yàn)闆]有給出生成$(BIN)具體方式所以在生成$(BIN)s時(shí)候編譯器會(huì)根據(jù)自己的規(guī)則自動(dòng)的生成相應(yīng)文件增加模式規(guī)則或者后綴規(guī)則之后就可以實(shí)現(xiàn) 下面的這些方式
新增加一個(gè)04test的文件只需要在makefile中all后面那一行增加一句 04test 的可執(zhí)行文件名字就行了
總結(jié)
以上是生活随笔為你收集整理的一步一步的写出你自己的makefile文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:林旺群(1983-),男,博士,
- 下一篇: 2015年《大数据》高被引论文Top10