对于单目录,只用到了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目标[此目标会清除临时的环境变量的值]