linux下的makefile编程

linux下编程使用makefile文件

 在谈makefile之前,先来看看下面几个小程序:

程序1:mytool1.c

#include"mytool1.h"
#include"stdio.h"
void mytool1_print(char* print_str)
{
    printf("This is mytool1 print %s\n", print_str);
}
程序2:mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char*);
#endif

程序3;mytool2.c

#include"mytool2.h"
#include"stdio.h"
void mytool2_print(char* print_str)
{
    printf("This is mytool2 print %s\n", print_str);
}
程序4:mytool2.h
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char* );
#endif

程序5:main.c

#include"mytool1.h"
#include"mytool2.h"
int main(void)
{
    mytool1_print("hello 1");
    mytool2_print("hello 2");

    return 0;
}

现在我们要运行main.c来打印输出
This is mytool1 print hello 1
This is mytool1 print hello 2

如图所示,所有源文件:

我们先按照常用的编译做法,对五个文件分别编译。
linux下的c/c++编译器是 gcc 和 g++, 不过,gcc使用的人比较多,这两个都能便于c和c++文件,下面以gcc编译为样例。  


gcc 的编译格式大致为:gcc -c 源文件  -o 目标文件

方式不唯一,其中“ c ”的含义是英文单词 compile 编译的缩写,” o “的含义是英文单词out输出的缩写, 如果没有指定生成目标文件,编译器默认生成跟源文件同名的编译文件。

编译上面的例子:
gcc -c mytool1.c -o mytool.o,这个命令是编译mytool1.c文件生成目标mytool1.o文件,这里生成文件mytool1其实可以写成任意的符号或者名称,如果写成gcc -c mytool1.c,系统默认生成mytool1.o文件。

以下,是编译步骤:

gcc -c mytool1.c
gcc -c mytool2.c
gcc -c main.c

下图是编译过程和结果。

1.分别编译三个源文件


 

2.gcc main.o  -o  main  mytool1.o mytool2.o

这句命令是将三个.o文件链接成可执行的main 程序。输入./main执行程序。

 

通过上面发现,生成main文件,我们需要编译了三次,太耗费时间。使用makefile编程,可进行大量编译。

1、在上面程序的同一路径建立一个makefile文件,不加后缀名,makefile内容如下所示。

这里的mian是最终的可执行程序,名字随便写都行。我写成了mian。

特别注意:gcc前面都是带有一个tab键的空格,这个不能少,少了就出错。尽量不要复制这几行代码,我的代码可能空格数不对,自己手到进去一个table键就行了。

mian:main.o mytool1.o mytool2.o
            gcc -o  mian  main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h
            gcc -c main.c

mytool1.o:mytoo1.c mytool1.h
            gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h
            gcc -c mytool2.c
 

makefile内容的解释:

每两行为一句,前一行给出生成的文件名,和所需要的文件,后一行给出方法。

mian:main.o mytool1.o mytool2.o
    gcc -o mian main.o mytool1.o mytool2.o
 

上面的代码解释为:

第一行解释:main 程序的生成是依赖main.o mytool1.o mytool2.o文件的。这行给出的是依赖关系。

第二行解释:这行给出了生成main程序的方法,方法是通过gcc -c main.o mytool1.o mytool2.o方法来生成的,
下面几行就不讲了,原理都是一样,先给出文件的依赖关系,再给出方法。

编写好makefile, 用输入命令"  make "进行大量编译,执行的顺序还是跟上面一样,截图如下:


 

2.上面的makefile其实还是不够简练,,我们发现里面反复出现了main.o mytool.o mytool2.o, 于是我们可以找一个变量名来代替它,下面代替名是objects;

下面是精简后的makefile:内容如下:

objects=main.o mytool1.o mytool2.o
main:$(objects)
    gcc -o mian $(objects)
main.o:main.c mytool1.h mytool2.h
    gcc -c main.c mytool1.h mytool2.h
mytool1.o:mytool1.c mytool1.h
    gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
    gcc -c mytool2.c
clean:
rm *.h.gch
    rm *.o

每个gcc都必须一个tab键空格。还要注意图中的mian和$之间是有空格的,不加空格,编译会出错。
clean:

    rm *.h.gch
    rm  *.o
上面的意思是清楚生成的.o文件和.h.gch文件,这些文件是中间文件,可以删除。

输入make clean命令就可以清除全部.o文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圣诞节不感冒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值