简介

  使用GCC的命令行进行程序编译在单个文件下是比较方便的,当工程中文件逐渐增多,甚至变得十分庞大的时候,使用GCC编译就会变得力不从心。linux中的make工具提供了一种管理工程的功能,可以方便地进行程序编译。

一个例子

一个工程文件列表如图所示:

各个文件内容如下:

1
2
3
4
5
6
/* add_float.c */
/* 浮点数求和函数 */
float add_float(float a, float b)
{
return a+b;
}
add_float.c
1
2
3
4
5
6
/* add_int.c */
/* 整数求和函数 */
int add_int(int a, int b)
{
return a+b;
}
add_int.c
1
2
3
4
5
6
/* sub_float.c */
/* 浮点数相减函数 */
float sub_float(float a, float b)
{
return a-b;
}
sub_float.c
1
2
3
4
5
6
/* sub_int.c */
/* 整数相减函数 */
int sub_int(int a, int b)
{
return a-b;
}
sub_int.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* main.c */
#include <stdio.h>
/*需要包含的头文件*/
#include "add.h"
#include "sub.h"
int main(void)
{
/*声明计算所用的变量 *a、b为整型,x、y为浮点型*/
int a = 10, b = 12;
float x= 1.23456,y = 9.87654321;

/*调用函数并将计算结果打印出来*/
printf("int a+b IS:%d\n",add_int(a,b)); /*计算整型加*/
printf("int a-b IS:%d\n",sub_int(a,b)); /*计算整型减*/
printf("float x+y IS:%f\n",add_float(x,y)); /*计算浮点型加*/
printf("float x-y IS:%f\n",sub_float(x,y)); /*计算浮点型减*/
return 0;
}
main.c

如果直接使用命令行编译,需要使用如下命令:

1
2
3
4
5
6
gcc -c -o add/add_int.o add/add_int.c
gcc -c -o add/add_float.o add/add_float.c
gcc -c -o sub/sub_int.o sub/sub_int.c
gcc -c -o sub/sub_float.o sub/sub_float.c
gcc -c -o main.o main.c -Iadd -Isub
gcc -o cacu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o

或者使用gcc默认规则直接使用最后一条命令生成可执行文件
但是这样很麻烦,所以makefile的意义就在于将这些命令集成到一个make命令里,使用make命令进行编程的时候,从makefile文件中读取设置情况,进行解析后运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#生成cacu,“:”右边为目标
cacu:add_int.o add_float.o sub_int.o sub_float.o main.o
gcc -o cacu add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
#生成add_int.o的规则,将add_int.c编译成目标文件add_int.o
add_int.o:add/add_int.c add/add.h
gcc -c -o add/add_int.o add/add_int.c
#生成add_float.o的规则
add_float.o:add/add_float.c add/add.h
gcc -c -o add/add_float.o add/add_float.c
#生成sub_int.o的规则
sub_int.o:sub/sub_int.c sub/sub.h
gcc -c -o sub/sub_int.o sub/sub_int.c
#生成sub_float.o的规则
sub_float.o:sub/sub_float.c sub/sub.h
gcc -c -o sub/sub_float.o sub/sub_float.c
#生成main.o的规则
main.o:main.c add/add.h sub/sub.h
gcc -c -o main.o main.c -Iadd -Isub

#清理的规则
clean:
rm -f cacu add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o