linux编程之make的使用
来源:互联网 发布:软件工程设计原则 编辑:程序博客网 时间:2024/05/18 13:45
程序维护工具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_Hvoid mytool1_print(char *printf_str);#endifmytool2.h文件
#ifndef _MYTOOL_2_H#define _MYTOOL_2_Hvoid mytool2_print(char *print_str);#endif接下来就是我们的重点makefile文件
main:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytool1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c有了这五个文件我们就可以测试了,运行make编译链接并运行,如下所示。
[bulecat@CentOS testMake]$ makegcc -c mytool2.cgcc -o main main.o mytool1.o mytool2.o[bulecat@CentOS testMake]$ ./mainThis is mytool1 print helloThis 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变量名是大小写敏感的。
- linux编程之make的使用
- Linux C编程---make命令的使用
- Linux C编程---make命令的使用
- Linux C编程---make命令的使用
- Linux下的C编程实战之gcc/gdb/make
- LINUX下的C编程实战之gcc/gdb/make
- Linux下的C编程实战之gcc\gdb\make
- linux编程学习笔记(五) make的使用和Makefile
- linux c编程:make Makefile工具的使用
- linux下编程工具之make篇
- GNU/Linux 编程指南之二:make
- Linux编程make命令
- Linux编程make命令
- Linux编程make命令
- linux 下 C 编程和make的方法 ( 九、malloc 和free的使用 上)
- linux 下 C 编程和make的方法 ( 九、malloc 和free的使用 上)
- 编程开发之make
- Linux之make的用法讲解
- lightoj 1042 Secret Origins(位运算符号的应用)
- 判断二叉树是否平衡 java
- tes
- stm32笔记:Systick系统滴答定时器
- Ubuntu 和 VMware tools文件夹共享问题
- linux编程之make的使用
- TCP发送数据流程详解
- startup_stm32f10x_xx.s 启动代码文件选择
- GCD内部实现--摘自《iOS与OS X多线程和内存管理》
- PAT(A) - 1024. Palindromic Number (25)
- Smart Install Maker制作安装包自动填写环境变量
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
- 设备 VMnet0 上的网络桥接当前未在运行。
- 字节序(大小端)详解从高低地址和高低位开始理解