一步一步的写出你自己的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 编译多个可执行文件
记住两种规则:
- 模式规则
- %.o:%.c //使用.c文件生成.o文件
- 后缀规则
- .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时候编译器会根据自己的规则自动的生成相应文件
阅读全文
0 0
- 一步一步的写出你自己的makefile文件
- 如何一步一步写出MVP架构的代码
- Makefile基础教程—写出你的第一个makefile
- 一步一步写MP3项目的Makefile--自动添加目标对头文件的依赖
- “万能makefile”写法详解,一步一步写一个实用的Makefile
- 一步一步学写makefile (二) - 变量的使用
- 一步一步写MP3项目的Makefile--构建MP3项目工程
- makefile文件的制作
- Makefile文件的编写
- makefile文件的编写
- MakeFile 文件的作用
- MakeFile 文件的作用
- MakeFile 文件的作用
- proc的makefile文件
- Makefile文件的编写
- 通用的MAKEFILE文件
- 简单的Makefile文件
- MakeFile 文件的作用
- python入门笔记import方法区别
- tensorflow 命令集合
- PAT 1088. Rational Arithmetic (20) 分数模拟计算+字符串处理
- B. 在哈尔滨的寒风中
- R语言不平衡数据分类指南
- 一步一步的写出你自己的makefile文件
- 2017/12/08
- 695. Max Area of Island
- CMake+mingw-w64编译opencv-3.3.1
- 问题 O: 中庸之道(二)
- 广东工业大学自动化(自动控制原理)作者:Haven
- 一元钱一瓶水,两个空瓶可以换一瓶,三个盖儿可以换一瓶,20元最多能喝多少?
- Wannafly挑战赛5 A珂朵莉与宇宙【暴力枚举】
- C/C++得到系统启动项