对于单目录,只用到了C标准库的程序而言,Makefile的写法比较简单
文件列表
[laolang@laolang makestudy]$ tree . ├── cal.c ├── cal.h ├── main.c └── Makefile 0 directories, 4 files [laolang@laolang makestudy]$cal.h
[laolang@laolang makestudy]$ cat cal.h #ifndef _CAL_H_ #define _CAL_H_ int sum( int a, int b ); #endif [laolang@laolang makestudy]$cal.c
[laolang@laolang makestudy]$ cat cal.c #include"cal.h" int sum( int a,int b ){ return a + b; } [laolang@laolang makestudy]$main.c
[laolang@laolang makestudy]$ cat main.c #include<stdio.h> #include"cal.h" int main( void ){ int a = 0; int b = 0; puts( "输入两个整数:" ); scanf( "%d %d",&a,&b ); printf( "%d + %d = %d\n",a,b,sum( a,b ) ); printf( "Hello World!\n小代码!\n" ); return 0; } [laolang@laolang makestudy]$Makefile
[laolang@laolang makestudy]$ cat Makefile # 功能:单一目录,只含有标准C程序的的Makefile的写法 # 时间:2015/10/11 20:32:04 # 作者:小代码 # 默认的可执行文件的名字 program=hello # C编译器 CC=gcc # C编译选项 CFLAGS=-Wall # 删除命令 RM=rm -rf # 源文件列表 srcs=$(wildcard *.c) # .o文件列表 objs=$(patsubst %.c,%.o,${srcs}) # 默认的目标,生成可执行程序 all:${program} ${program}:${objs} ${CC} -o $@ $^ .PHONY:exec clean rebuild list # 执行 exec:${program} ./${program} # 清理 clean: -${RM} ${objs} -${RM} ${program} # 重新编译 rebuild:clean ${program} # 输出源文件列表,.o文件列表,以及可执行程序的名称 list: @echo ${srcs} @echo ${objs} @echo ${program} [laolang@laolang makestudy]$运行过程:
[laolang@laolang makestudy]$ ls cal.c cal.h cal.o hello main.c main.o Makefile [laolang@laolang makestudy]$ make exec ./hello 输入两个整数: 2 3 2 + 3 = 5 Hello World! 小代码! [laolang@laolang makestudy]$ make clean rm -rf main.o cal.o rm -rf hello [laolang@laolang makestudy]$ ls cal.c cal.h main.c Makefile [laolang@laolang makestudy]$ make gcc -Wall -c -o main.o main.c gcc -Wall -c -o cal.o cal.c gcc -o hello main.o cal.o [laolang@laolang makestudy]$ make rebuild rm -rf main.o cal.o rm -rf hello gcc -Wall -c -o main.o main.c gcc -Wall -c -o cal.o cal.c gcc -o hello main.o cal.o [laolang@laolang makestudy]$ make exec ./hello 输入两个整数: 2 3 2 + 3 = 5 Hello World! 小代码! [laolang@laolang makestudy]$有待改进的地方:
1、应该可以指定可执行程序的名称
2、应当可以指定编译器使用gcc还是clang进行
可以指定可执行文件名称的Makefile
[laolang@laolang makestudy]$ cat Makefile # 功能:单一目录,只含有标准C程序的的Makefile的写法 # 时间:2015/10/11 20:32:04 # 作者:小代码 # 默认的可执行文件的名字 PROGRAM= program= # 判断是否指定可执行程序的名称 ifdef name PROGRAM=${name} else PROGRAM+=hello endif program=$(strip ${PROGRAM}) # C编译器 CC=gcc # C编译选项 CFLAGS=-Wall # 删除命令 RM=rm -rf # 源文件列表 srcs=$(wildcard *.c) # .o文件列表 objs=$(patsubst %.c,%.o,${srcs}) # 默认的目标,生成可执行程序 all:${program} ${program}:${objs} ${CC} -o $@ $^ .PHONY:exec clean rebuild list mytest # 执行 exec:${program} ./${program} # 清理 clean: -${RM} ${objs} -${RM} ${program} # 重新编译 rebuild:clean ${program} # 输出源文件列表,.o文件列表,以及可执行程序的名称 list: @echo ${srcs} @echo ${objs} @echo ${program} mytest: @echo ${message} [laolang@laolang makestudy]$执行过程:
[laolang@laolang makestudy]$ ls cal.c cal.h cal.o code main.c main.o Makefile [laolang@laolang makestudy]$ make name=code exec ./code 输入两个整数: 3 4 3 + 4 = 7 Hello World! 小代码! [laolang@laolang makestudy]$ make name=code clean rm -rf main.o cal.o rm -rf code [laolang@laolang makestudy]$ ls cal.c cal.h main.c Makefile [laolang@laolang makestudy]$ make name=code gcc -Wall -c -o main.o main.c gcc -Wall -c -o cal.o cal.c gcc -o code main.o cal.o [laolang@laolang makestudy]$ make name=code rebuild rm -rf main.o cal.o rm -rf code gcc -Wall -c -o main.o main.c gcc -Wall -c -o cal.o cal.c gcc -o code main.o cal.o [laolang@laolang makestudy]$ make name=code clean rm -rf main.o cal.o rm -rf code [laolang@laolang makestudy]$ ls cal.c cal.h main.c Makefile [laolang@laolang makestudy]$主要就是添加了一个判断,另外指定clang编译器这一部分我没有写
可以看到,指定可执行文件的名称实现了,只是每次执行make命令都要加上name=code参数,否则执行exec或者clean的时候会出错
有待改进的地方:
也许可以考虑在Makefile中使用export与unset对shell的环境变量进行操作,再添加一个cleanall目标[此目标会清除临时的环境变量的值]
原文:http://my.oschina.net/iamhere/blog/515594