博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Linux基础】简单Make程序创建
阅读量:4282 次
发布时间:2019-05-27

本文共 2727 字,大约阅读时间需要 9 分钟。

使用Vi编辑器,将以下代码输入到文件中。

我们有一个程序由5 个文件组成,源代码如下:

/*main.c*/

#include "mytool1.h"

#include "mytool2.h"

int main()

{

mytool1_print("hello mytool1!");

mytool2_print("hello mytool2!");

return 0;

}

/*mytool1.c*/

#include "mytool1.h"

#include <stdio.h>

void mytool1_print(char *print_str)

{

printf("This is mytool1 print : %s ",print_str);

}

/*mytool1.h*/

#ifndef _MYTOOL_1_H

#define _MYTOOL_1_H

void mytool1_print(char *print_str);

#endif

/*mytool2.c*/

#include "mytool2.h"

#include <stdio.h>

void mytool2_print(char *print_str)

{

printf("This is mytool2 print : %s ",print_str);

}

/*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

//TAB键隔开 gcc -o main main.o mytool1.o mytool2.o

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

//TAB键隔开 gcc -c main.c

mytool1.o:mytool1.c mytool1.h

//TAB键隔开 gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

//TAB键隔开 gcc -c mytool2.c

clean:

rm -f *.o main

在shell 提示符下输入make,执行显示:

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

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

执行结果如下:

[armlinux@lqm makefile-easy]$ ./main

This is mytool1 print : hello mytool1!

This is mytool2 print : hello mytool2!

这只是最为初级的Makefile,main是我们的最终目标,main.o、mytool1.o和mytool2.o是目标所依赖的源文件,下面是一条命令“gcc -o main main.o mytool1.o mytool2.o”(以Tab键开头)。这个规则告诉我们两件事:

1、文件的依赖关系,main依赖于main.o、mytool1.o和mytool2.o文件,如果main.o、mytool1.o和mytool2.o的文件日期要比main文件日期要新,或是main不存在,那么依赖关系发生。

2、如何生成(或更新)main文件。也就是那个gcc命令,其说明了,如何生成main这个文件。

目标、依赖、命令的书写格式为:

targets : prerequisites

//TAB键隔开command

或是这样:

targets : prerequisites ; command

//TAB键隔开command

小知识

command是命令行,如果其不与“target:prerequisites”在一行,那么,必须以[Tab键]开头,如果和prerequisites在一行,那么可以用分号做为分隔。

clean是一个伪目标,即然我们生成了许多编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)

因为我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。

当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

.PHONY : clean

只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。于是整个过程可以这样写:

.PHONY: clean

clean:

rm *.o temp

在这个Makefile中有4 个目标体(target),分别为main、main.o、mytool1和mytool2,其中第一个目标体的依赖文件就是后三个目标体。如果用户使用命令“make main”,则make管理器就是找到main目标体开始执行。这时,make会自动检查相关文件的时间戳。首先,在检查“main.o”、“mytool1.o”、“mytool2.o”和“main”4 个文件的时间戳之前,它会向下查找那些把“main.o”或“mytool1.o”或“mytool2.o”作为目标文件的时间戳。比如,“mytool1.o”的依赖文件为“mytool1.c”、“mytool1.h”。如果这些文件中任何一个的时间戳比“mytool1.o”新,则命令“gcc–c mytool1.c”将会执行,从而更新文件“mytool1.o”。在更新完“mytool1.o”或“mytool2.o”或“main.o”之后,make会检查最初的“main.o”、“mytool1.o”、“mytool2.o”和“main”3 个文件,只要文件“main.o”或“mytool1.o”或“mytool2.o”中的任比文件时间戳比“main”新,则第二行命令就会被执行。这样,make就完成了自动检查时间戳的工作,开始执行编译工作。这也就是Make工作的基本流程。

 

本文转载于,【Linux基础】简单Make程序创建

(出处: )

你可能感兴趣的文章
基于数据融合和串级PID的小型四旋翼无人机高度测量与控制系统
查看>>
四旋翼飞行器Quadrotor飞控之 PID调节(参考APM程序)
查看>>
最流行的开源飞控项目ArduPilot Mega(APM)介绍及发展历史
查看>>
利用加速度求解位置的算法——三轴传感器
查看>>
基于STM32的开源微型四轴飞行器
查看>>
Crazyflie微型四轴 深入解读1
查看>>
Crazyflie微型四轴 深入解读2
查看>>
四旋翼微型飞行器设计
查看>>
android如何改变系统默认横竖屏方向
查看>>
普通gpio口的申请和设置
查看>>
在kernel里添加一个i2c外围设备
查看>>
android lcd调试 高通平台lcd调试深入分析总结(mipi和rgb接口)
查看>>
高通平台开机logo连续显示调试总结
查看>>
Android display架构分析
查看>>
高通安卓调试LCD几方面总结(一)
查看>>
高通安卓调试LCD几方面总结(二)
查看>>
高通平台 lcd driver 调试小结
查看>>
开机logo切换逻辑深入研究
查看>>
高通平台手机开发之LCD
查看>>
高通平台修改LK(bootloader)开机logo
查看>>