linux编程之make的使用

程序维护工具make

Linux环境下编写代码使用GUN的make可以比较方便的构建自己的项目。通常一个应用程序会包含许多文件,当只有一个源文件的时候,当然还是选择手动编译链接,当应用程序有相当多的文件的时候,通过gcc手动编译就显得相当困难。如果其中某个文件被修改,就需要对文件进行重新编译链接,此时如果手动编译的话就相当浪费时间。使用程序维护工具make,我们需要定义一个makefile或者Makefile文件,在makefile写清楚规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译等。make就像一个shell脚本,这里面的内容不仅相当清楚地描述整个工程的依赖关系,而且可以执行操作系统的命令编译链接解决这些依赖关系。我们可以把它理解成shell脚本,而“脚本”里的命令就是我们手动编译链接过程中需要敲的那些命令,这样就可以敲一次命令到“脚本”中去,然后只需要一个make命令,自动执行命令,自动编译链接。下面我写了一个简单的demo

这个demo一共包含main.c、mytool1.c、mytool2.c、mytool1.h、mytool2.h五个源文件和一个makefile文件(在同一个目录下)。

main.c文件

#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
	mytool1_print("hello");
	mytool2_print("hello");
}
mytool1.c文件

#include<stdio.h>
#include "mytool1.h"
void mytool1_print(char *print_str)
{
	printf("This is mytool1 print %s\n",print_str);
}
mytool2.c文件

#include <stdio.h>
#include "mytool2.h"
void mytool2_print(char *print_str)
{
	printf("This is mytool2 print %s\n",print_str);
}
mytool1.h文件

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *printf_str);
#endif
mytool2.h文件

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
接下来就是我们的重点makefile文件

main:main.o mytool1.o mytool2.o
	gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
	gcc -c main.c
mytool1.o:mytool1.c mytool1.h
	gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
	gcc -c mytool2.c
有了这五个文件我们就可以测试了,运行make编译链接并运行,如下所示。

[bulecat@CentOS testMake]$ make
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
[bulecat@CentOS testMake]$ ./main
This is mytool1 print hello
This is mytool2 print hello
[bulecat@CentOS testMake]$ 

我们来解释一下makefile文件的内容。main:main.o mytool1.o mytool2.o这一行代码描述了产生main这个可执行文件需要链接main.o,mytool1.0,mytool2.o这三个对象文件,接下来的gcc -o main main.o mytool1.o mytool2.o命令就是系统要完成上述描述要执行的命令。然而main.o这个对象文件本身并不存在呀,它从哪里来呢?接下来一句main.o:main.c mytool1.h mytool2.h就描述了它的“来历”,就是它的依赖关系,同理gcc -c main.c就是系统实际上执行的那条命令。


在这里我们简单补充一下gcc命令中参数-c,-o的区别:-c只编译不链接,生成.o(obj)文件,-o既编译又链接,生成可执行文件。

现在我们已经会简单实用make工具了。那么make的工作机制是什么呢?

make的主要功能是执行成成新版本的目标程序所需的各个步骤,即自动检测一个大型程序的哪一部分需要重新编译,然后发出命令重新编译。GUN的make的工作过程如下:

1、依次读入每个makefile文件。

2、初始化文件中的变量。

3、推导隐式规则,并分析所有的规则。

4、位所有目标文件创建依赖关系链。

5、根据依赖关系和时间数据,确定哪些文件需要重新生成。

6、执行相应的生成命令。


什么是隐式规则?

隐式规则为make提供了重建目标文件的通用方法,不需要在makefile中明确的给出重建特定目标文件所需要的描述细节。make预先设置了很多隐含规则,如果不明确写下规则,make就会在隐含规则中寻找所需要的规则和命令。下面是几个常用的隐含规则:

1、编译c程序,.o文件自动由.c文件生成。

2、编译c++程序,.o文件自动由.cc文件生成。

3、链接单一的object文件,file文件自动由file.o生成,通过c编译器使用链接器,此规则仅适用由一个源文件可直接产生可执行文件的情况。


注意事项:

makefile中的变量就像一个环境变量,作用是可以用来保存文件名列表、编译选项列表、程序运行的选项参数列表、搜索源文件的目录列表、编译输出的目录列表等。

make变量名是大小写敏感的。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值