标签:
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在makefile中执行shell脚本。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile简介
1 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需 要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
2 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的 make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
3 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
编译和链接规则(输入make命令之后将按照以下规则工作
通用的Makefile里包含什么?
完整Makefile里包含什么?
st_work : main.o st_work.o fun.o gcc main.o st_work.o fun.o -o st_work main (命令一定要用以Tab开头) st_work.o : st_work.c gcc -c st_work.c -o st_work main.o : main.c st_work.h gcc -c main.c -o main.o fun.o : fun.c fun.h gcc -c fun.c -o fun.o clean: rm -f st_work *.o -c参数,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件
多目录下Makefile的写法(1)
目标:在工作目录下有4个文件夹 分别是 sources(源文件) obj (中间文件)headers(头文件) bin(目标文件)
sources里面有 main.c st_work.c fun.c
obj 里面最初没有文件
headers 里面有 fun.h st_work.h
最终目标取名为 st_work 它应存放到bin里面
开始写Makefile的预备知识:
gcc 的3个参数:
1. -o 指定目标文件
gcc sources/main.c -o bin/main
2. -c 编译的时候只生产目标文件不链接
gcc -c sources/main.c -o obj/main.o
3. -I 主要指定头文件的搜索路径
gcc -I headers -c main.c -o main.o
多目录下Makefile的写法(2)
bin/st_work : obj/main.o obj/st_work.o obj/fun.o
gcc obj/main.o obj/st_work.o obj/fun.o -o bin/st_work (命令一定要用以Tab开头)
obj/st_work.o : sources/st_work.c
gcc -I headers -c sources/st_work.c -o obj/st_work.o
obj/main.o : sources/main.c
gcc -I headers -c sources/main.c -o file_o/main.o
obj/fun.o : sources/fun.c
gcc -I headers -c file_c/fun.c -o file_o/fun.o
clean:
rm -f bin/st_work file_o/*.o
用隐式规则改进:
3个符号介绍:
1. $@ 表示要生成的目标
2. $^ 表示全部的依赖文件
3. $< 表示第一个依赖文件
bin/st_work : obj/main.o obj/st_work.o obj/fun.o
gcc $^ -o $@ (命令一定要用以Tab开头)
obj/st_work.o : sources/st_work.c
gcc -I headers -c $< -o $@
obj/main.o : sources/main.c
gcc -I headers -c $< -o $@
obj/fun.o : sources/fun.c
gcc -I headers -c $< -o $@
clean:
rm -f bin/st_work file_o/*.o
变量的引入和应用:
CC=gcc
HD=-I headers
SC=-c $<
OBJ=-o $@
bin/st_work : obj/main.o obj/st_work.o obj/fun.o
gcc $^ -o $@ (命令一定要用以Tab开头)
obj/st_work.o : sources/st_work.c
$(CC) $(HD) $(SC) $(OBJ)
obj/main.o : sources/main.c
$(CC) $(HD) $(SC) $(OBJ)
obj/fun.o : sources/fun.c
$(CC) $(HD) $(SC) $(OBJ)
clean:
rm -f bin/st_work file_o/*.o
提示信息
clean: clean:
rm -f bin/st_work file_o/*.o @rm -f bin/st_work file_o/*.o
这样就没信息输出了
标签:
原文地址:http://www.cnblogs.com/lihuidashen/p/4611641.html