单目录,标准C程序的Makefile


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

转载于:https://my.oschina.net/iamhere/blog/515594

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值