对于单目录,只用到了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