Linux嵌入式学习之Ubuntu入门(四)Makefile

news2024/12/25 22:33:25

系列文章目录

一、Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装及文件结构

二、Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等

三、Linux嵌入式学习之Ubuntu入门(三)用户、用户组及文件权限


文章目录

  • 系列文章目录
  • 什么是Makefile
  • 什么是GCC
  • Makefile文件规范
  • 简单例子中的规范写法
  • Makefile变量写法
  • Makefile其他符号
    • 打印输出
    • “=”
    • “:=”
    • “+=”
    • “?=”
  • Makefile模式规则
  • Makefile自动化变量
  • Makefile伪目标
  • Makefile条件判断
    • ifeq与ifneq
    • ifdef与ifndef
  • Makefile函数


什么是Makefile

在Linux下,借助例如gcc编译器编译时,如果有很多的文件:

1、如果工程没有编译过,那么工程中的所有.c 文件都要被编译并且链接成可执行程序。
2、如果工程中只有个别 C 文件被修改了,那么只编译这些被修改的 C 文件即可。
3、如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的 C 文件,并且链接成可执行文件。

什么是GCC

gcc [选项] [文件名字]
主要选项如下:
-c: 只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。
-o: <输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC 默认编译出来的可执行文件名字为 a.out。
-g: 添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编译的时候生成调试所需的符号信息。
-O: 对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进行优化,这样产生的可执行文件执行效率就高。
-O2: 比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。

在程序中,int main(int argc, char *argv[])是什么意思:
很多程序都是带参数运行的,如:del readme.txt,此时,运行的程序就是del.exe,而readme.txt就是它的参数,
argc = 1,(1个参数)
argv[0] = “readme.txt”(接收的字符串);
假设一个程序的main函数不带任何参数,那么很显然,它仍可以运行,只是,不接收参数。

Makefile文件规范

1.所有行首需要空出来的地方一定要使用“TAB”键!不要使用空格键!
2.make 命令会在当前目录下查找是否存在“Makefile”这个文件(小写也可以)

简单例子中的规范写法

在这里插入图片描述
makefile中,一般将第一行作为默认目标,所以clean不会执行,可以使用nake clean执行。(clean是伪目标)
同时make过程中,会自动输出这些命令,如果前面加上@,这些命令就不会输出。

Makefile变量写法

在这里插入图片描述

Makefile其他符号

打印输出

echo:相当printf
在这里插入图片描述

“=”

赋值符号:这里输出的就是

 name = jia
 curname = $(name)
 name = jiahj

print:
 @echo curname: $(curname)

这里输出结果是:curname:jiahj
使用的是最新赋值的变量

“:=”

 name = jia
 curname  := $(name)
 name = jiahj

print:
 @echo curname: $(curname)

这里输出结果是:curname:jia
使用的前面定义好的

“+=”

变量追加符号

objects = main.o inpiut.o
objects += calcu.o

变量 objects 变成了“main.o input.o calcu.o”

“?=”

curname ?= jia

变量如果前面没有被赋值,那么该变量就是jia

Makefile模式规则

用%表示任意长度的非空字符串,例如:“%.c”就是所有的.c文件

Makefile自动化变量

在这里插入图片描述

上面的那个makefile例子可以变成下面形式:

objects = main.o input.o calcu.o
main: $(objects)
 gcc -o main $(objects)

%.o : %.c
 gcc -c $<

clean:
 rm *.o
 rm main

Makefile伪目标

像之前执行的make clean一样,当该目录下有一个clean文件的时候,就无法执行makefile的clean目标了

PHONY : clean

用如上命令将clean声明成伪目标就可以了
在这里插入图片描述
在这里插入图片描述

Makefile条件判断

语法:在这里插入图片描述

ifeq与ifneq

下面几种写法都可以
在这里插入图片描述
ifeq判断参数1与2是否相等,相等则为真。ifneq反之

ifdef与ifndef

在这里插入图片描述
变量名的值为非空即为真,否则为假。ifndef反之

Makefile函数

用法:
在这里插入图片描述
参数之间用逗号,函数名与参数之间用空格

函数名含义
$(subst < x1>,< x2>,< text>)将字符串< text>中的< x1>内容替换为< x2>,函数返回被替换以后的字符串
$(patsubst < pattern>,< replacement>,< text>)查找字符串< text>中的单词是否符合模式< pattern>,如果匹配就用< replacement>来替换掉,函数返回值就是替换后的字符串
$(dir <names…>)从文件名序列< names>中提取出目录部分,返回值是文件名序列< names>的目录部分
$(notdir <names…>)去除文件中的目录部分,也就是提取文件名,
$(foreach < var>, < list>,< text>)把参数< list>;中的单词逐一取出放到参数< var>;所指定的变量中,然后再执行< text>;所包含的表达式。
$(wildcard PATTERN…)通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,这个时候就要用到函数 wildcard

例子:
1.

$(patsubst %.c,%.o,a.c b.c c.c)

将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字符串为“a.o b.o c.o”。

$(dir </src/a.c>)

提取文件“/src/a.c”的目录部分,也就是“/src”。

$(notdir </src/a.c>)

提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。

names := a b c d
files := $(foreach n,$(names),$(n).o)

$ (name)中的单词会被挨个取出,并存到变量“n”中,“ $ (n).o”每次根据“$ (n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是“a.o b.o c.o d.o”。
5.

$(wildcard *.c)

获取当前目录下所有的.c 文件,类似“%”。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go语言切片做函数参数传递+append()函数扩容

go语言切片函数参数传递append()函数扩容 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 二叉树递归go代码&#xff1a; var ans [][]int func pathSum(root *TreeNode, targetSum int) ( [][…

Longitudinal Change Detection on Chest X-rays Using Geometric Correlation Maps

文章来源&#xff1a;[MICCAI2019] Keywords&#xff1a;Chest X-ray&#xff1b;Longitudinal analysis&#xff1b;Change detection&#xff1b;Geometric correlation 一、本文提出的问题以及解决方案 在胸部X-ray图像的诊断中&#xff0c;医生会考虑与先前检查相比病变的…

8.网络爬虫—正则表达式RE实战

8.网络爬虫—正则表达式RE实战正则表达式&#xff08;Regular Expression&#xff09;re.Ire.Are.Sre.Mre.Xre.Lre.U美某杰实战写入csv文件&#xff1a;前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Pyth…

MongoDB 聚合管道的文档操作($sort,$skip,$limit,$sample,$unwind)

目前为止&#xff0c;我们已经介绍了一部分聚合管道中的管道参数&#xff1a; $match&#xff1a;文档过滤 $group&#xff1a;文档分组&#xff0c;并介绍了分组中的常用操作&#xff1a;$addToSet&#xff0c;$avg&#xff0c;$sum&#xff0c;$min&#xff0c;$max等。 $add…

COCO数据集相关知识介绍

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;总结链接&#xff1a; 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c;代码直接复制运行即可。包括&#xff1a; &am…

SpringTx 源码解析 - @Transactional 声明式事务执行原理

一、Spring Transactional 声明式事务执行原理 Transactional 是 Spring 框架中用于声明事务的注解&#xff0c;可以标注在方法或类上。当标注在类上时&#xff0c;表示该类的所有public方法都将支持事务。当标注在方法上时&#xff0c;表示该方法将在一个事务内执行。 Trans…

BGP对等体建邻配置

BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种&#xff1a;1、使用物理接口建邻 2、使用环回借口建邻&#xff0c;针对不同的BGP对等体选用不同的建邻方式。 EBGP的建邻主要使用的是物理接口建邻 IBGP的建邻主要使用的是环回接口建邻 这两种建邻方…

VBA的面向接口编程

工作中有时候会用到VBA&#xff08;Visual Basic for Applications&#xff09;&#xff0c;不是很多&#xff0c;也没有专门去学习VBA&#xff0c;用的时候遇到问题就上网去查资料&#xff0c;解决问题了就放下了。 今天被同事问到VBA中类的用法&#xff0c;我从来没有用过&am…

论文解读:基于 OpenMLDB 的流式特征计算优化

近期&#xff0c;数据库领域的顶级学术会议 ICDE 2023 在迪斯尼主题公园的故乡 - 美国的安纳海姆&#xff08;Anaheim&#xff09;举办。由 OpenMLDB 开源社区和新加坡科技设计大学&#xff08;Singapore University of Technology and Design&#xff09;联合完成的研究工作在…

Vue2-黑马(三)

目录&#xff1a; &#xff08;1&#xff09;vue2-axios &#xff08;2&#xff09;axios-发送请求 &#xff08;3&#xff09;vue2-axios-请求体格式 &#xff08;4&#xff09;vue2-axios-默认配置 &#xff08;1&#xff09;vue2-axios 已经配置了代理&#xff0c;可以…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤&#xff1a; 在Linux中安装Git在Linux中安装maven编写shell脚本&#xff08;拉取代码、编译、打包、启动&#xff09;为用户授予执行shell脚本的权限执行shell脚本 执行过程&#xff1a;Linux服务器&#xff08;编译、打包、启动&#x…

每天一道大厂SQL题【Day21】华泰证券真题实战(三)

每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

爱智EdgerOS之深入解析爱智云原生产品ECSM

一、云原生简介 近些年来&#xff0c;云原生逐渐被业界认可和接受&#xff0c;在国内&#xff0c;包括政府、金融、通信、能源在内的众多领域的大型机构和企业都实现了不同程度的云化&#xff0c;那么什么是云原生呢&#xff1f;云原生计算基金会提供了官方的定义&#xff1a;…

参考|雨水情测报和大坝安全监测系统建设方案

解决方案 小型雨水情测报和大坝安全监测系统解决方案&#xff0c;系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成&#xff0c;同时建立规范、统一的监测平台&#xff0c;集数据传输、信息共享、数据储存…

比较系统的学习 pandas (6)

pandas 数据类型转换 在开始数据分析前&#xff0c;有时需要为数据分配好合适的类型&#xff0c;这样才能 够高效地处理数据 # 对所有字段指定统一类型 data pd.DataFrame(data, dtypefloat32) # 对每个字段分别指定 data pd.read_excel(data.xlsx, dtype{name: string, sc…

CUDA和TensorRT入门

CUDA 官方教程&#xff1a;CUDA C Programming Guide (nvidia.com) 一、基础知识 首先看一下显卡、GPU、和CUDA的关系介绍&#xff1a; 显卡、GPU和CUDA简介_吴一奇的博客-CSDN博客 延迟&#xff1a;一条指令返回的时间间隔&#xff1b; 吞吐量&#xff1a;单位时间内处理…

libwebsockets交叉编译

libwebsockets官网&#xff1a;https://libwebsockets.org/ github&#xff1a;https://github.com/warmcat/libwebsockets 首先下载libwebsockets源码&#xff0c;源码既可以在其官网上下载&#xff0c;也可以到github上下载。这里以v4.1.6为例&#xff0c;https://github.co…

react项目中自定义一个markdown编辑器

Markdown 是一种轻量级标记语言。 Markdown是一种简单的格式化文本的方法&#xff0c;在任何设备上看起来都很棒。它不会做任何花哨的事情&#xff0c;比如改变字体大小、颜色或类型——只是基本的&#xff0c;使用你已经知道的键盘符号。 它还允许人们使用易读易写的纯文本格…

为什么众多大型国企都在升级企业数智化底座?

在数字经济大潮中&#xff0c;数字化转型已不是企业的“选修课”&#xff0c;而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中&#xff0c;国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一&#xff0c;数字化能力也成为衡量…

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…