3.makefile运行流程分析并使用变量改写项目

news/2024/11/16 7:30:19/文章来源:https://www.cnblogs.com/codemagiciant/p/18352406

3.makefile运行流程分析并使用变量改写项目

  • GNU make用来构建和管理自己的工程
  • Makefile 文件描述了整个工程的编译、连接等规则

3.1makefile变量的使用

命令格式 含义
CXX C++编译器的名称,默认值为g++
CXXFLAGS C++编译器的选项,无默认值
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并出现的先后序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称

版本1:

#first_makefirst_make:first_make.cpp xdata.cppg++ first_make.cpp xdata.cpp - o first_make - lpthread

版本2:

#first_makefirst_make:first_make.cpp xdata.cpp$(CXX) first_make.cpp xdata.cpp - o first_make - lpthread

版本3:

#first_make
# $^ 依赖 不重复
# $@ 目标
first_make:first_make.cpp xdata.cpp$(CXX) $^ -o $@ - lpthread

版本4:

# first_make
# $^ 依赖 不重复
# $@ 目标
TARGET=first_make$(TARGET):first_make.cpp xdata.cpp$(CXX) $^ -o $@ -lpthreadecho "build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# ls
first_make.cpp  makefile  xdata.cpp  xdata.h
root@cmt-virtual-machine:/home/cmt/src/first_make# make
g++ first_make.cpp xdata.cpp -o first_make -lpthread
echo "build success!"
build success!
root@cmt-virtual-machine:/home/cmt/src/first_make# 

echo "build success!" 是一个简单的命令,用于在终端上输出文本 "build success!"。在这个上下文中,它的作用是向用户提示编译过程已经成功完成。具体来说:

  • 输出消息echo 是一个常见的 shell 命令,用于在终端中输出一段文本。这里的文本是 "build success!"
  • 通知用户:当编译和链接过程完成后,make 运行了 echo 命令,以便在终端中打印一条消息,告诉用户构建过程已经成功结束。

版本5:

# first_make
# $^ 依赖 不重复
# $@ 目标
TARGET=first_make$(TARGET):first_make.cpp xdata.cppecho "begin build $(TARGET)"$(CXX) $^ -o $@ -lpthreadecho "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# ls
first_make.cpp  makefile  xdata.cpp  xdata.h
root@cmt-virtual-machine:/home/cmt/src/first_make# make
echo "begin build first_make"
begin build first_make
g++ first_make.cpp xdata.cpp -o first_make -lpthread
echo "first_make build success!"
first_make build success!
# first_make
# $^ 依赖 不重复
# $@ 目标
# @ 不显示命令执行
TARGET=first_make$(TARGET):first_make.cpp xdata.cpp@echo "begin build $(TARGET)"@$(CXX) $^ -o $@ -lpthread@echo "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# make
begin build first_make
first_make build success!

版本6:执行一段代码有可能失败

# first_make
# $^ 依赖 不重复
# $@ 目标
# @ 不显示命令执行
TARGET=first_make$(TARGET):first_make.cpp xdata.cpprm test@echo "begin build $(TARGET)"@$(CXX) $^ -o $@ -lpthread@echo "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# make
rm test
rm: 无法删除 'test': 没有那个文件或目录
make: *** [makefile:8:first_make] 错误 1
root@cmt-virtual-machine:/home/cmt/src/first_make# 

失败后后面的代码不执行。

我们希望失败后,继续执行后面的代码

# first_make
# $^ 依赖 不重复
# $@ 目标
# @ 不显示命令执行 -失败不停止
TARGET=first_make
LIBS=-lpthread
$(TARGET):first_make.cpp xdata.cpp@#-rm test@echo "begin build $(TARGET)"@$(CXX) $^ -o $@ $(LIBS)@echo "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# make
begin build first_make
first_make build success!

参考资料来源:夏曹俊

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Epson L4168 固件升级

我的Epson L4168打印机提示固件升级,我手贱就点了OK。过一会再来看,发现打印机直接黑屏 显示EPSON PRINTER Recovery Mode,一看就知道升级失败变砖了。按任何键都没有反应。中文官网上没有这款打印机的recovery mode修复帮助。我就搜索一下其它国家的官网上发现L4168在北美地…

costmap代价地图

1 什么是costmap代价地图在机器人进行路径规划时,我们需要明白规划算法是依靠什么在地图上来计算出来一条路径的。依靠的是gmapping扫描构建的一张环境全局地图,但是仅仅依靠一张原始的全局地图是不行的。因为这张地图是静态的,无法随时来更新地图上的障碍物信息。在现实环境…

店铺点评_1_短信登录功能

1 短信登录 1.1 导入点评项目框架 1. 当前模型简述手机/app端发起请求,请求nginx服务器。(nginx基于七层模型走HTTP协议,可以实现基于Lua直接绕开tomcat访问redis;也可以作为静态资源服务器,实现上万并发,负责均衡到下游tomcat服务器,打散流量。一台4核8G的tomcat,在优…

sql优化小tips

sql优化小tips基础sql优化1、避免使用select * 尽量要什么字段查什么字段, select * 多查出来的数据在网络上IO传输的过程中,会增加数据传输的是的时间。且 select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。 ​ 覆盖索引(Covering Index): 覆盖…

一些面试小tips

反射 它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。 反射可以让代码更加灵活、(为各种框架提供开箱即用的功能提供了便利),一般我们写业务代码接触到直接使用反射机制的场景不多,但是在…

暑假集训CSP提高模拟17

暑假集训CSP提高模拟17 组题人: @joke3579\(T1\) P222. 符号化方法初探 \(70pts\)原题: [ABC081D] Non-decreasing部分分测试点 \(1\) :输出样例 \(1\) 。 测试点 \(11 \sim 15\) :由于 \(\{ a \}\) 非负,所以对 \(\{ a \}\) 作前缀和即可。 随机 \(pts\) :乱搞。正解当 …

一款.NET开发的AI无损放大工具

前言 今天大姚给大家分享一款由.NET开源(GPL-3.0 license)、基于腾讯ARC Lab提供的Real-ESRGAN模型开发的AI无损放大工具:AI-Lossless-Zoomer。Real-ESRGAN模型专注于人像和动漫图片的高质量无损放大。项目功能 支持多线程处理、批量图片处理、设置选项、自定义输出格式和自…

Java知识点1

Java知识点 什么是字节码?采用字节码的好处是什么? 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。字节码…

Python-快速语法参考-全-

Python 快速语法参考(全)原文:The Python Quick Syntax Reference 协议:CC BY-NC-SA 4.0零、简介 Python 提供的最好的东西之一是一个广泛的标准库,它提供了广泛的包含特性,从网络功能、数据库处理和 XML 处理一直到 zip 文件处理。有数百个额外的库扩展了 Python 的能力…

最小斯坦纳树(动态规划求解+原创讲解细节)

最小斯坦纳树给定点的“最小生成树”问题。背景 给定无向连通图 \(G=(V,E)\),给出包含 \(k\) 个结点的点集 \(S\),包含点集 \(S\) 的连通图被称作 斯坦纳树。但我们关注的是如何求出包含点集 \(S\) 的最小连通图 \(G=(V,E)\) 即 最小斯坦纳树。其中\(S\subseteq V,E\subseteq…

Convert类型转换

static void Main(string[] args){//Convert转换:不同数据类型之间的转换;//大前提: 面儿上一定要过得去Console.WriteLine("请输入你的姓名:");string strName = Console.ReadLine();Console.WriteLine("请输入你的数学成绩:");double douMath = Convert.…

python程序代码这样加密保护,你觉得可以吗?

python程序代码很容易反编译,下面我体验了pyhton代码保护的好方法,方案支持windows与Linux系统,下面以linux系统为例进行加密演示。 下载最新Linux平台开发工具包http://chinadlp.com/?list-DriveDownload.html 拷贝到有桌面的Ubuntu系统中 解压:tar -xzf Sentinel-LDK.ta…