Linux中Makefile用法及变量

一、介绍

1.Makefile概述

       (1)make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE            都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make

       (2)自动化编译:一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软          件开发的效率 

        (3)提高编译效率:再次编译,只编译修改的文件 

2.Makefile基本语法

        (1)Makefile基本结构 
         Makefile是Make读入的唯一配置文件 
          * 由make工具创建的目标体(target),通常是目标文件或可执行文件
          * 要创建的目标体所依赖的文件(dependency_file)
          * 创建每个目标体时需要运行的命令(command)
          * 注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator.  Stop.
         Makefile格式
         target  :   dependency_files
         <TAB>  command
         例子
            hello.o :  hello.c hello.h
            gcc  –c  hello.c  –o  hello.o

3.具体编写makefile文档如下:

        

        注:上面都是建立在所有文件都有的情况下,也可以不写makefile文档,直接编译即可

4.然后执行make即可如下:

        

        注:自己定义的头文件要以”“为基准,然后.c文件中也保持一致”“

5.注意make只会编译修改后的文件,以及删除可执行文件.o,在执行make会重新生成的

        

6.在makefile文件中末尾加入clean,如下:

        

        注:makefile执行时候,只执行一行的目标:依赖,后面就不执行了,所以要把最终的test:          add.o...放在第一行,此时生成test的文件需要依赖三个.o文件,所以要去寻找一下当前3个文          件,如果有的话就追溯到.o文件哪来的,进而就执行后面的文件了,这也解释了为什么要把            最终文件放在第一行的原因了

        运行时,要在make后面加入clean后如下:

        

7.如果该目录下存在相同文件的clean怎么办?

        (1)vim Makefile,修改里面的文件加入目标:依赖关系

                

        (2)然后就可以使用make clean:

                

二、Makefile创建变量的目的

1.创建目的的目的

       *用来代替一个文本字符串
       * 系列文件的名字  
       * 传递给编译器的参数 
       * 需要运行的程序 
       * 需要查找源代码的目录 
       * 你需要输出信息的目录  
       * 你想做的其它事情。     

2.自定义变量

        x=a 变量在声明时需要给予初值

        $(x)或${x} 取值

        如果你要使用真实的$字符,那么你需要$$来表示

3.一个自定义变量的小例子,就是基于上面的makefile文件中的来改写的

        

        * 将之前的字符串给换成自定义的变量即可

        *最后执行make发现没有报错

        

4.赋值的操作:

        ?=:前面定义赋值过了就不在赋值了

        :=:前面赋值过了,在赋值定义一次

        +=:追加赋值,在旧值上加上新值

三、自动变量

        (1)指令:

            $*      不包含扩展名的目标文件名称
            $+      所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
            $<      第一个依赖文件的名称
            $?      所有时间戳比目标文件晚的的依赖文件,并以空格分开
            $@    目标文件的完整名称
            $^      所有不重复的目标依赖文件,以空格分开
            $%     如果目标是归档成员,则该变量表示目标的归档成员名称

        (2)代码如下:

        

        注:如果不想要不想要显示echo那一行指令,就在echo前加入@

        (3)可以将makefile文件里进一步的替换:

        

四、Makefile的隐含变量

        (1)保存命令的隐含变量

                AR:库文件维护程序的名称

                AS:汇编程序的名称

                CC:C编译器的名称

                CPP:C预编译器的名称

                CXX:C++编译器的名称

                FC:FORTRAN编译器的名称

                RM:文件删除程序的名称

        (2)隐含命令所用到的选项

                ARFLAGS:库文件维护程序的选项

                ASFLAGS:汇编程序的选项

                CFLAGS:C编译器的选项

                LDFLAGS:链接器的选项

                CPPFLAGS:C预编译的选项

                CXXFLAGS:C++编译器的选项

                FFLAGS:FORTRAN编译器的选项

        (3)案例如下:

                

                注:-c -g -wall ,-g是可以gdb调试,-wall是可以报错,也可以指定头文件,比如:-I                 include(include当前目录下,如果不在当前目录就用绝对,/home/linux/Makefile/include)

五、Makefile的条件判断

        (1)ifeq:判断是否相等

        (2)ifneq:判断是否不相等

        (3)ifdef:判断是否定义过,定义就是是否给赋值

        (4)ifndef:判断是否未定义过

        (5)案例如下:

        

        注:ifeq与endif匹配,或者ifneq与else、endif相配对

六、Makefile函数

        (1)Makefile函数

                基本语法:

                        $(<function><arguments>) or ${<function><arguments>}

                        例如:$(wildcard PATTERN)

                        功能:列出当前目录下所有符合模式"PATTERN"格式的文件名

                        返回:空格分割的、存在当前目录的所有符合模”PATTERN“的文件名

                        说明:”PATTERN“使用shell可识别的通配符,包括”?“(单字符)、(多字符)等

        (2)案例:$(wildcard *.c)返回值为当前目录下所有.c源文件列表

                

        (3)$(patsubst <pattern>,<replacement>,<text>)

                名称:模式字符串替换函数

                功能:查找<text>中的单词(单词以:”空格“、”Tab“、”回车“、”换行“分隔)是否符合模                        式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配                  符%,表示任意长度的字串。如果<replacement>中也包含%,那么,<replacement>中的                  这个%将是<pattern>中的%所表示的字串。(可以用\来转义,以\%来表示真实含义的%)

                返回:函数返回被替换过后的字符串

                例子:$(patsubst %.c,%.o,x.c.c bar.c)

                        把字串x.c.c bar.c 符合模式%.c的单词替换成%.o,返回结果是x.c.o、bar.o

        (4)例子如下:

                

        (5)Makefile自定义函数

                示例:$(call <expression>,<parm2>,<parm3>...)

                

                

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/341205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业相机+镜头选型及靶面、焦距计算等相关详解

工业相机镜头选型及靶面、焦距计算等相关详解 着重讲述相机的各个参数及使用意义总结相机镜头选型主要参数的推理计算 0. 工业相机相关概念简介 相机与镜头一览 工业相机与镜头实物图如下图所示&#xff1a; 常见的相机有两种供电方式&#xff1a;一种是电源线供电&#xff0…

怎么抹掉 Macbook系统 并将它还原为出厂设置

抹掉 Mac 并将它还原为出厂设置 借助“抹掉所有内容和设置”这项功能&#xff0c;你可以快速安全地抹掉所有设置、数据和 App&#xff0c;同时保留当前安装的操作系统。 使用“抹掉所有内容和设置” 这项功能要求装有 macOS Monterey 或更高版本&#xff0c;且使用搭载 Apple 芯…

计算机毕业设计 基于SpringBoot的律师事务所案件管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Linux的一些快捷键(hot keyboard)

Ctrl Alt t&#xff1a;打开bash&#xff08;就是命令框窗口&#xff09; Ctrl Alt F3~F6&#xff1a;打开tty终端&#xff08;纯命令行终端&#xff0c;每个Linux发行版不相同&#xff0c;我的是Ubuntu20版&#xff09; Alt F4&#xff1a;关闭当前窗口&#xff08;Windo…

快乐学Python,使用爬虫爬取电视剧信息,构建评分数据集

在前面几篇文章中&#xff0c;我们了解了Python爬虫技术的三个基础环节&#xff1a;下载网页、提取数据以及保存数据。 这一篇文章&#xff0c;我们通过实际操作来将三个环节串联起来&#xff0c;以国产电视剧为例&#xff0c;构建我们的电视剧评分数据集。 1、需求描述 收集…

NOC总线(2)

1. NoC的路由 在NoC交换信息时&#xff0c;需要确定从源节点到目标节点所经过的路径&#xff0c;这时就需要路由算法来确定该路径。路由算法分为静态路由算法和动态路由算法两种。 静态路由算法对于两节点之间的路径是固定的&#xff0c;结构简单&#xff0c;便于硬件实…

FPGA中跨时钟域传数据——(1)单bit脉冲

FPGA中跨时钟域传数据——&#xff08;1&#xff09;单bit脉冲 亚稳态模型由快时钟传到慢时钟由慢时钟传到快时钟 亚稳态模型 必须在建立时间和保持时间内&#xff0c;数据不变化&#xff0c;否则会产生亚稳态。 由快时钟传到慢时钟 在快时钟里面进行数据展宽&#xff08;…

时间序列预测 — CNN-LSTM-Attention实现多变量负荷预测(Tensorflow):多变量滚动

专栏链接&#xff1a;https://blog.csdn.net/qq_41921826/category_12495091.html 专栏内容 ​ 所有文章提供源代码、数据集、效果可视化 ​ 文章多次上领域内容榜、每日必看榜单、全站综合热榜 ​ ​ ​ ​ ​ ​ ​ 时间序列预测存在的问题 ​ 现有的大量方法没有真正的预测未…

ELK+Filebeat 部署实验

Filebeat是轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat&#xff0c;并指定目录与日志格式&#xff0c;Filebeat 就能快速收集数据&#xff0c;并发送给 logstash 进行解析&#xff0c;或是直接发给 Elasticsearch 存储&#xff0c;性能上相比运行…

CentOS 7 安装配置MySQL

目录 一、安装MySQL​编辑​编辑 1、检查MySQL是否安装及版本信息​编辑 2、卸载 2.1 rpm格式安装的mysql卸载方式 2.2 二进制包格式安装的mysql卸载 3、安装 二、配置MySQL 1、修改MySQL临时密码 2、允许远程访问 2.1 修改MySQL允许任何人连接 2.2 防火墙的问题 2…

AnimatedDrawings:让绘图动起来

老样子&#xff0c;先上图片和官网。这个项目是让绘制的动画图片动起来&#xff0c;还能绑定人体的运动进行行为定制。 快速开始 1. 下载代码并进入文件夹&#xff0c;启动一键安装 git clone https://github.com/facebookresearch/AnimatedDrawings.gitcd AnimatedDrawingspip…

java web servlet 学习系统进度管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web学习系统进度管理系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环 境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为…

图神经网络X项目|基于图神经网络的电商行为的预测(5%)

文章目录 Jupyter Notebook 学习人工智能的好帮手数据集数据集下载数据集调用数据集应用技巧——获取不重复的编号数据集应用技巧——随机采样数据集应用技巧——抽取前N项进行模拟测试 数据集构建技巧一——查看数据集构建进度 Jupyter Notebook 学习人工智能的好帮手 【Jupy…

thinkphp5实战之phpstudy v8环境搭建,解决Not Found找不到路径问题

引言 thinkphp以快速、简约的大道至简的思想广受欢迎&#xff0c;适合开发小型项目。本地环境下&#xff0c;phpstudy v8是一款比较优秀的集成环境软件。部署完项目后&#xff0c;访问的时候傻眼&#xff0c;报错。 解决方案 不要慌&#xff0c;这个是伪静态的原因。选择apach…

DophineScheduler通俗版

1.DophineScheduler的架构 ZooKeeper&#xff1a; AlertServer&#xff1a; UI&#xff1a; ApiServer&#xff1a; 一个租户下可以有多个用户&#xff1b;一个用户可以有多个项目一个项目可以有多个工作流定义&#xff0c;每个工作流定义只属于一个项目&#xff1b;一个租户可…

BACnet网关 BL120BN实现楼宇自控设备统一接入系统,BACnet转Modbus

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

mysql生成最近24小时整点时间临时表

文章目录 生成最近24小时整点生成最近30天生成12个月 生成最近24小时整点 SELECT-- 每向下推1行, i比上次减去1b.*, i.*,DATE_FORMAT( DATE_SUB( NOW(), INTERVAL ( -( i : i - 1 ) ) HOUR ), %Y-%m-%d %H:00 ) AS time FROM-- 目的是生成12行数据( SELECTa FROM( SELECT 1 A…

RectMask2D的合批情况验证

1.经过实际测试&#xff0c;RectMask2D在裁剪区域完全相同且位置完全重合的情况下能够合批 但是当RectMask2D位置不重合时&#xff0c;就不能合批 注意&#xff0c;虽然此处被RectMask2D裁剪了&#xff0c;但是有部分是被渲染的&#xff0c;在计算深度时属于需要渲染…

深入MySQL窗口函数:原理和应用

在现代数据库管理系统中&#xff0c;窗口函数&#xff08;Window Functions&#xff09;已经成为处理复杂数据分析任务的关键工具。MySQL从8.0版本开始引入了对窗口函数的支持&#xff0c;这极大地增强了其在数据分析和报表生成方面的能力。本文将深入探讨MySQL窗口函数的原理、…

Mapbox加载浙江省天地图服务和数据处理

1. 加载影像服务 通过浙江省天地图官网申请所需服务&#xff0c;使用token获取服务数据 由于浙江省天地图使用的坐标系是 cgcs2000&#xff0c;需要使用 的框架对应为 cgcs2000/mapbox-gl&#xff0c;通过cdn引入或npm下载 影像服务地址为&#xff1a; ‘https://ditu.zjzw…