c语言标准化文件路径,单目录,标准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

#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目标[此目标会清除临时的环境变量的值]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值