一、make概述

    make是一种代码维护工具make工具会根据makefile文件定义的规则和步骤,完成整个软件项目的代码维护工作。一般用来简化编译工作,可以极大地提高软件开发的效率。 windows下一般由集成开发环境自动生成

    linux下需要由我们按照其语法自己编写

    Make主要解决两个问题:

    1.大量代码的关系维护

       大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及   维护把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文   件自动执行相应命令,可实现代码的合理编译

    2.减少重复编译时间

       在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重   新编译,然后重新链接所有的目标文件,节省编译时间

二、makefile语法

    makefile语法规则

    目标:依赖文件列表

    <Tab> 命令列表

    1、目标:

       通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个  动的名称

    2、依赖文件:

       是用来输入从而产生目标的文件一个目标通常有几个依赖文件(可以没有)

    3、命令:

       make执行的动作,一个规则可以含几个命令(可以没有)有多个命令时,每个命   令占一行
 举例:

三、make命令

    make命令格式:make [ -f file ] [options ] [ targets ]

1. [ -f file ] :

    make默认在工作目录中寻找名为GUNmakefile、makefile、Makefile的文件作为makefile输入文件

    -f可以指定以上名字以外的文件作为makefile输入文件

2. [ options ]

    执行参数:辅助makefile执行

    [ options ]的含义:

    -v:显示make工具的版本信息

    -w:在处理makefile之前和之后显示工作路径

    -C dir:读取makefile之前改变工作路径至dir目录

    -n:只打印要执行的命令但不执行

    -s:执行但不显示执行的命令

3. [ targets ] :

    若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出

    指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)。

printf1.c和printf1.h文件在最后一次编译到printf1.o目标文件后没有改动,它们不需重新编译

main可以从源文件中重新编译并链接到没有改变的printf1.o目标文件。

printf1.c和printf1.h源文件有改动,make将在重新编译main之前自动重新编译printf1.o。

四、makefile变量

1.makefile变量类似于C语言中的宏,当makefile被make工具解析时,其中的变量会被展开。

2.变量的作用:

保存文件名列表

保存文件目录列表

保存编译器名

保存编译参数

保存编译的输出

3.makefile的变量分类:

(1)自定义变量

在makefile文件中定义的变量。

make工具传给makefile的变量

(2)系统环境变量

make工具解析makefile前,读取系统环境变量

并设置为makefile的变量。

(3)预定义变量(自动变量)

4.自定义变量语法

(1)定义变量:变量名=变量值

引用变量:$(变量名)或${变量名}

(2)makefile的变量名:makefile变量名可以以数字开头

(3)变量是大小写敏感的

(4)变量一般都在makefile的头部定义

(5)变量一般都在makefile的头部定义

(6)举例:

执行make命令时,make的参数options也可以给makefile设置变量。

makecc=arm-linux-gcc

执行make命令时,make的参数options也可以给makefile设置变量。

makecc=arm-linux-gcc

5.系统环境变量

(1)make工具会拷贝系统的环境变量并将其设置为makefile的变量,在 makefile中 可直接读取或修改拷贝后的变量

(2)举例:

新建makefile2

注释:@,只显示执行结果

        终端执行:

           export test=10

           make clean –f makefile2

        结果如下:

6. 预定义变量

       makefile中有许多预定义变量,这些变量具有特殊的含义,可在makefile中直   接使用。

       $@ 目标名

$* 目标名中除含扩展名的部分:扩展名包括:S、s、C、c、cc、cp、cpp、o、a等

$< 依赖文件列表中的第一个文件

$^ 依赖文件列表中除去重复文件的部分

$+ 依赖文件列表中所有的文件

$? 依赖文件列表中比目标文件新的文件

AR 归档维护程序的程序名,默认值为ar

ARFLAGS 归档维护程序的选项

AS 汇编程序的名称,默认值为as

ASFLAGS 汇编程序的选项

CC C编译器的名称,默认值为cc

CFLAGS C编译器的选项

CPP C预编译器的名称,默认值为$(CC) -E

CPPFLAGS C预编译的选项

CXX C++编译器的名称,默认值为g++

CXXFLAGS C++编译器的选项

---------------------------------------------------------------------------------------

附带三种变量的栗子:

编写Makefile完成计算器程序的编译,并通过假想目标(clean)清除目标文件

第一步:不使用任何变量完成功能

main:main.o add.o div.o mux.o sub.o

       gcc main.o add.o div.omux.o sub.o -o main   

main.o:main.c add.h div.h mux.h sub.h

       gcc -c main.c -o main.o

add.o:add.c add.h

       gcc -c add.c -o add.o

div.o:div.c div.h

       gcc -c div.c -o div.o

mux.o:mux.c mux.h

       gcc -c mux.c -o mux.o

sub.o:sub.c sub.h

       gcc -c sub.c -o sub.o

clean:

       rm *.o

第二步:使用自定义变量让程序更加通用

file=gcc

#file=gcc

obj:=main.o add.o div.o mux.o sub.o

target=main

cflags=-Wall -g

 

$(target):$(obj)

       $(file) $(obj) -o$(target) $(cflags)      

main.o:main.c add.h div.h mux.h sub.h

       $(file) -c main.c -omain.o $(cflags)

add.o:add.c add.h

       $(file) -c add.c -oadd.o $(cflags)

div.o:div.c div.h

       $(file) -c div.c -odiv.o $(cflags)

mux.o:mux.c mux.h

       $(file) -c mux.c -omux.o $(cflags)

sub.o:sub.c sub.h

       $(file) -c sub.c -osub.o $(cflags)

clean:

       rm $(obj) $(target)

第三步:使用预定义变量让程序更加通用

obj:=main.o add.o div.o mux.o sub.o

target=main

CFLAGS=-Wall -g

 

$(target):$(obj)

       $(file) $^ -o $@$(CFLAGS)   

main.o:main.c add.h div.h mux.h sub.h

       $(file) -c $@ $(CFLAGS)

add.o:add.c add.h

       $(file) -c $@ $(CFLAGS)

div.o:div.c div.h

       $(file) -c $@ $(CFLAGS)

mux.o:mux.c mux.h

       $(file) -c $@ $(CFLAGS)

sub.o:sub.c sub.h

       $(file) -c $@ $(CFLAGS)

clean:

       rm $(obj) $(target)

————————————————
版权声明:本文为CSDN博主「Amarao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jinmie0193/article/details/79842137

linux工程管理软件—make的更多相关文章

  1. Linux工程管理器——make

    一.定义 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Make ...

  2. linux工程管理工具make入门

    一.make工具的功能 1.主要负责一个软件工程中多个源代码的自动编译工作 2.还能进行环境检测.后期处理等工作: 3.make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文 ...

  3. 5款Linux最佳照片管理软件

    在谈到 Linux 中的应用程序时,对于不同的用户.不同的使用场景以及不同的使用习惯,在同一类应用当中,总会有多种软件可供选择和备选.就 Linux 中的照片管理软件来说,相信此前的 Google P ...

  4. Linux 管理软件

    公司的openfire先前运行在windows上的,但由于在windows上openfire内存机制问题,最多只能占用2GB内存,且时间稍微长久一些就会自动挂掉,用户无法登陆和连接,因此迁移到了Cen ...

  5. Linux基础三(软件安装管理)

    目录: 一.Linux 中软件包的分类 1.源码包 2.二进制包 3.源码包 4.软件安装的选择 二.软件安装之 RPM 1.背景知识 2.准备知识 3.安装升级与卸载 4.查询校验与提取 三.软件安 ...

  6. 如何在Linux上安装服务器管理软件Cockpit

    Cockpit 是一个自由开源的服务器管理软件,使得我们可以通过它好看的 Web 前端界面轻松地管理我们的 GNU/Linux 服务器,非常轻量级,Web 界面也非常简单易用. Cockpit 使得 ...

  7. 在 Linux 上安装服务器管理软件 Cockpit

    Cockpit 是一个自由开源的服务器管理软件,它使得我们可以通过它好看的 web 前端界面轻松地管理我们的 GNU/Linux 服务器.Cockpit 使得 linux 系统管理员.系统维护员和开发 ...

  8. Linux之yum软件管理

    YUM yum = Yellow dog Updater, Modified主要功能是更方便的添加/删除/更新RPM包.它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 yum特点 *可以 ...

  9. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

随机推荐

  1. dubbo API的使用方式

    本文使用maven方式 1:pom文件 <dependencies> <!-- 引入spring的jar --> <dependency> <groupId& ...

  2. L ==> E · L · K

    三剑客:Elastic Stack 在学习ELK前,先对 Lucene作基本了解. 今天才知道关系型数据库的索引是 B-Tree,罪过... 减少磁盘寻道次数 ---> 提高查询性能 Lucen ...

  3. ORA-03113:通信通道的文件结尾 解决办法

    登录Oracle时出现错误:“ORA-03113:通信通道的文件结尾” 错误排查方法 Oracle出现错误,查看trace日志寻找问题根源:D:\oracle\diag\rdbms\orcl\orcl ...

  4. mysql安装和遇到的问题处理

    遇到需要在新系统上安装MySQL的事情,简单记录一下过程. 声明:最好的文档是官方文档,我也是看的官方文档,只是中间遇到点问题,记录一下出现的问题和处理方式.贴一些官方文档地址. 用tar包的安装方式 ...

  5. python返回值的缺省设置

    有时候并不需要返回所有的值,但是原始函数的return语句中又有较多参数时: 方法一:修改原始返回值,只返回需要的参数 方法二:如果原始函数时第三方库或者python自带库,则直接修改可能不太好,于是 ...

  6. RT-Thread--线程间同步

    线程间同步 一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递: 如果对共享内存的访问不是排他性的,那么各个线程 ...

  7. C++读取中文或英文文件空格分割

    // show file content - sbumpc() example #include <iostream> // std::cout, std::streambuf #incl ...

  8. 请教一个问题关于JVM的,跪求大佬解答

    问题地址:https://blog.csdn.net/java_wxid/article/details/103021907

  9. js for/in循环及其它

    for in 循环不仅可以遍历对象的属性,还可以遍历数组. Js 中为数组提供了多种遍历方式 const ary = ['a', 'b', 'c']; // 最基本的方式, 只能遍历下标有序递增的数组 ...

  10. 脚本put数据到hdfs

    1.vim putdata.sh 脚本功能: 每小时的第15分钟把上一小时的数据put到hdfs相应目录 为了避免大量的小文件,我们把文件夹下的文件cat到一个临时文件里,put成功后删除这个临时文件 ...