一步一步的写出你自己的makefile文件

来源:互联网 发布:gt610疯牛病版 知乎 编辑:程序博客网 时间:2024/05/29 18:00
main:main.o add.o sub.o    gcc  -g main.o add.o sub.o -o mainmain.o:main.c    gcc  -g -c main.c -o main.oadd.o:add.c add.h    gcc  -g -c add.c -o add.osub.o:sub.c sub.h    gcc  -g -c sub.c -o sub.o

使用的makefile 文件的小结

main:main.o add.o sub.o   //生成main可执行文件的方式    gcc  -g main.o add.o sub.o -o main  //命令行有TAB 开始                //main依赖于 main.o add.o sub.omain.o:main.c   //main.o 生成依赖于 main.c    gcc  -g -c main.c -o main.o  //add.o:add.c add.h  //add.o的的生成依赖于add.c add.h    gcc  -g -c add.c -o add.o   sub.o:sub.c sub.h    gcc  -g -c sub.c -o sub.o
.PHONY:clean   //显式的生命 clean 是一个伪目标  //这样就算是有一个文件命名为clean在执行make clean的时候也不会  make: 'clean' is up to date.main:main.o add.o sub.o    gcc  -g main.o add.o sub.o -o mainmain.o:main.c    gcc  -g -c main.c -o main.oadd.o:add.c add.h    gcc  -g -c add.c -o add.osub.o:sub.c sub.h    gcc  -g -c sub.c -o sub.oclean:    rm -f main main.o add.o sub.o

makefile 的自动化变量

$@  规则的目标文件名$< 规则的第一个依赖文件名 $^ 规则的所有的文件列表

下面是使用了自动化变量之后的makefile文件的编写,对比之前那的可以简化很多

.PHONY:clean   #在这里说明  clean是一个伪变量OBJECTS = main.o add.o sub.o    #makefile 中的自定义的变量 main:$(OBJECTS)    gcc  -g  $^ -o $@    # $^依赖文件列表    $@ 目标main.o:main.c    gcc  -g -c $< -o $@   #$<依赖文件列表中的第一个依赖文件add.o:add.c add.h    gcc  -g -c $< -o $@sub.o:sub.c sub.h    gcc  -g -c $< -o $@clean:    rm -f main $(OBJECTS)

当一个文件中有多个makefie的时候可以使用
makefile clean -f makefile.1 //这样就是说使用makefile.1中的说明去执行makefile需要执行的文件

rosfun@ubuntu:~/makefile$ make clean -f makefile.1
.PHONY:cleanmain:main.o add.o sub.o    gcc  -g main.o add.o sub.o -o mainmain.o:main.c    gcc  -g -c main.c -o main.oadd.o:add.c add.h    gcc  -g -c add.c -o add.osub.o:sub.c sub.h    gcc  -g -c sub.c -o sub.oclean:    echo "begin delete..................."    rm -f main main.o add.o sub.o

执行的结果是:

rosfun@ubuntu:~/makefile$ make clean -f makefile.1echo "begin delete..................."begin delete...................rm -f main main.o add.o sub.o

优化之后:

.PHONY:cleanmain:main.o add.o sub.o    gcc  -g main.o add.o sub.o -o mainmain.o:main.c    gcc  -g -c main.c -o main.oadd.o:add.c add.h    gcc  -g -c add.c -o add.osub.o:sub.c sub.h    gcc  -g -c sub.c -o sub.oclean:    @echo "begin delete..................."  #这一句不想被打印出来 加上@ 符号    rm -f main main.o add.o sub.o

执行结果

rosfun@ubuntu:~/makefile$ make clean -f makefile.1begin delete...................rm -f main main.o add.o sub.orosfun@ubuntu:~/makefile$ 

也就是说在命令行的前面加上@ makefile文件就会只执行相应的命令但是不把这一行打印出来

使用makefile 生成两个都含有主函数的.c文件

rosfun@ubuntu:~/makefile/02$ touch 01test.c 02test.crosfun@ubuntu:~/makefile/02$ ls01test.c  02test.crosfun@ubuntu:~/makefile/02$ gedit 01test.crosfun@ubuntu:~/makefile/02$ gedit 02test.crosfun@ubuntu:~/makefile/02$ ls01test.c  02test.crosfun@ubuntu:~/makefile/02$ gedit makefilerosfun@ubuntu:~/makefile/02$ makecc     01test.c   -o 01testcc     02test.c   -o 02testrosfun@ubuntu:~/makefile/02$ ./01testhello worldrosfun@ubuntu:~/makefile/02$ ./02test02rosfun@ubuntu:~/makefile/02$ gedit makefile

执行的结果如上:实现过程和相应为makefile文件如下:

.PHONY:clean  all    BIN=01test 02test    #all 也是一个伪命令  all:$(BIN)   #因为all是一个伪命令 所以在生成的时候不会生成 到时all的生成是依赖于$(BIN)的生成的要是想生#成 all就必须先生成 $(BIN) 因为没有给出生成$(BIN)具体方式所以在生成$(BIN)s时候编译器会根据自己的规则自动的生成相应文件 

在使用gcc 生成可执行文件的时候 不需要使用 -c 说明
如下:

.PHONY:clean  all    BIN=01test 02test    #all 也是一个伪命令  all:$(BIN) 01test:01test.o    gcc -g $^ -o $@   #要是生成可执行文件 不需要使用  -c02test:02test.o    gcc -g $^ -o $@   #正常的情况下clean:    rm -f $(BIN) #因为all是一个伪命令 所以在生成的时候不会生成 到时all的生成是依赖于$(BIN)的生成的要是想生#成 all就必须先生成 $(BIN) 因为没有给出生成$(BIN)具体方式所以在生成$(BIN)s时候编译器会根据自己的规则自动的生成相应文件 

使用makefile 编译多个可执行文件

记住两种规则:

  1. 模式规则
  2. %.o:%.c //使用.c文件生成.o文件
  3. 后缀规则
  4. .c.o: //使用.c文件生成.o文件

第一节课的生成多个可执行文件的makefile的编写方式

增加模式规则或者后缀规则之后就可以实现 下面的这些方式

#生成多个还要主函数的文件的   makefile文件   主要是加上 虚拟目标 .PHONY:all .PHONY:clean  all    CC=gcc                     #定义一个变量用来替换gccCFLAGS= -gBIN=01test 02test 03test    #all 也是一个伪命令  all:$(BIN)       ##%.o:%.c      #使用模式规则#   gcc -g -c $< -o $@    #生成  .o文件要加上 -c说明.c.o:    $(CC) $(CFLAGS) -c $< -o $@01test:01test.o    $(CC) -g $^ -o $@   #要是生成可执行文件 不需要使用  -c02test:02test.o    gcc -g $^ -o $@03test:03test.o public.o    #新增加的public文件03test可执行文件的生成依赖于public文件加上的方式    $(CC) $(CFLAGS) $^ -o $@clean:    echo "正在清除相应的编译文件!!!!"    @echo "正在清除相关的编译文件!!!!"    rm -f $(BIN) #因为all是一个伪命令 所以在生成的时候不会生成 到时all的生成是依赖于$(BIN)的生成的要是想生#成 all就必须先生成 $(BIN) 因为没有给出生成$(BIN)具体方式所以在生成$(BIN)s时候编译器会根据自己的规则自动的生成相应文件 

增加模式规则或者后缀规则之后就可以实现 下面的这些方式
新增加一个04test的文件只需要在makefile中all后面那一行增加一句 04test 的可执行文件名字就行了

#生成多个还要主函数的文件的   makefile文件   主要是加上 虚拟目标 .PHONY:all .PHONY:clean  all    CC=gcc                     #定义一个变量用来替换gccCFLAGS= -gBIN=01test 02test 03test 04test    #all 也是一个伪命令  all:$(BIN)       ##%.o:%.c      #使用模式规则#   gcc -g -c $< -o $@    #生成  .o文件要加上 -c说明.c.o:    $(CC) $(CFLAGS) -c $< -o $@01test:01test.o    $(CC) -g $^ -o $@   #要是生成可执行文件 不需要使用  -c02test:02test.o    gcc -g $^ -o $@03test:03test.o public.o    $(CC) $(CFLAGS) $^ -o $@clean:    echo "正在清除相应的编译文件!!!!"    @echo "正在清除相关的编译文件!!!!"    rm -f $(BIN) #因为all是一个伪命令 所以在生成的时候不会生成 到时all的生成是依赖于$(BIN)的生成的要是想生#成 all就必须先生成 $(BIN) 因为没有给出生成$(BIN)具体方式所以在生成$(BIN)s时候编译器会根据自己的规则自动的生成相应文件 
原创粉丝点击