首页 > 其他分享 >Makefile入门学习过程中的一些知识点-一些常见规则或语法:

Makefile入门学习过程中的一些知识点-一些常见规则或语法:

时间:2024-10-17 19:47:50浏览次数:10  
标签:知识点 objs %. 入门 文件 ++ Makefile cpp main

1.order-only依赖

还是以上一篇的sudoku项目为例,之前写的目标之后的依赖都属于普通依赖,普通依赖都对应自身的规则,order-only依赖也是一样的,但是当依赖文件中的内容发生改动的时候,两种依赖就会产生差别:对于普通依赖而言,当依赖发生改变需要重新与目标文件生成链接,也就是说如果任何一个依赖文件修改时间比目标晚,那么就需要重新生成目标文件;对于order-only依赖而言,如果发生改变,它不会对目标文件更新产生影响,或者说,不需要重新产生新的链接。order-only的格式也很简单,就是文件名前面加一个“|”

e.g. sudoku : block.o command.o … | test.o

根据示例,“|”之后的依赖就是order-only依赖。

2.多个目标多个规则的情况

这个其实很好理解,因为总会出现同一个目标有相同的依赖这个问题,那么独立的这几个目标就可以使用符号“:”进行链接,也就是写成:

block.o input.o scene.o : common.h

这句的意思其实就是block.o,input.o和scene.o分别都依赖common.h这个文件。如此进行改编,那么相应的编译命令也可以改编:

block.o command.o input.o main.o scene.o test.o : common.h block.h command.h ...

    g++ -c $(@:%.o=%.cpp)

g++ -c $(@:%.o=%.cpp) 和之前的例子都是一个编译命令,用于编译一个名为%.o的object文件(其中%是一个通配符,表示任意字符串)。编译器使用g++,-c表示仅编译,不链接。$(@:%.o=%.cpp)是一个变量赋值命令,将%.o替换为%.cpp,即获取源文件名,一个意思换种写法。作用是将一个名为%.o的object文件编译成对应的源文件%.cpp。

3.静态模式

在进行多目标的编写时,如果出现文件经常改动,每次都需要重新编译生成文件的话会比较麻烦,这个时候可以用一种方法进一步去简化sudoku这个例子,并且解决依赖的问题,这个方法就是静态模式。

因为makefile的一种书写方式时独立多目标的书写,独立多目标可以简化Makefile的书写,但是不利于将各个目标的依赖分开,让目标文件根据各自的依赖进行更新。静态模式可以在一定程度上改进依赖分开问题。直接上改编之后的例子(未完全):

objs = block.o command.o i18n.o input.o main.o scene.o

sudoku: $(objs)

        g++ -o $@ $^

$(objs) : %.o : %.cpp %.h

        g++ -c $<

相比较于上一篇末的sudoku的例子,这个写法大幅度的简化了写法。其中命令行:$(objs) : %.o : %.cpp %.h就是主要的改编内容。翻译一下就是:取每一个.o文件对应的依赖文件.cpp以及.h文件,%号第二点也说过了是通配符,类似于“所有”的意思。那这样make一下,系统就会自己推断寻找文件目录下的对应文件了。当然对于当前的例子,还是有点问题的,因为main文件没有对应的.h文件,所以make一下会报错。因此如果有个别文件是缺少.o或者.h等文件的,需要单独拿出来写。

objs = block.o command.o i18n.o input.o main.o scene.o

sudoku: $(objs) main.o

        g++ -o $@ $^

$(objs) : %.o : %.cpp %.h

        g++ -c $<

main.o : %.o : %.cpp

        g++ -c $<

4.依赖路径指定

路径的指定一般发生在系统找不到文件的情况。还是以sudoku作为例子,原先的所有文件都在同一个目录中,先新建两个文件夹,将除了main.cpp以外所有的.cpp文件存储到src文件夹中,将所有的.h文件以及.inl文件存储到include文件夹中。此时如果还是按照之前的语言来make,那么会报错,因为找不到文件。

   ->  

这个时候需要指定一下路径,有两种方式

VPATH

注意观察VPATH这一行,src和include就是我们刚刚新建的文件夹,“:”放在不同的文件夹之间。那么这个时候系统就会去这两个文件夹中搜索问价了。其中,要注意的是“-I”命令,就如例子所写的-Iinclude,因为我们编译器是在当前的main所在的文件夹中的,但是我们去找头文件等是在include文件夹中的(之前我们把.h等文件放在include文件夹中了),这和编译器不在一个目录里面,因此如果没有这个-I命令,就会编译错误。

objs = block.o command.o i18n.o input.o main.o scene.o

VPATH = src:include

sudoku: $(objs) main.o

        g++ -o $@ $^

$(objs) : %.o : %.cpp %.h

        g++ -c $< -Iinclude

main.o : %.o : %.cpp

        g++ -c $< -Iinclude

.PHONY: clean

clean:

        -rm sudoku.exe

        -rm $(objs)main.o

vpath:

对于小写的vpath,这种用法要更灵活一点,因为它是单独为某种文件指定对应的路径,语法格式为:vpath <文件格式(可以是具体的文件名)> <路径>。

objs = block.o command.o i18n.o input.o main.o scene.o

vpath %.h include

vpath %.cpp src

sudoku: $(objs) main.o

        g++ -o $@ $^

$(objs) : %.o : %.cpp %.h

        g++ -c $< -Iinclude

main.o : %.o : %.cpp

        g++ -c $< -Iinclude

.PHONY: clean

clean:

        -rm sudoku.exe

        -rm $(objs)main.o

将这两行替换VPATH那一行,也是正确的。

标签:知识点,objs,%.,入门,文件,++,Makefile,cpp,main
From: https://blog.csdn.net/qq_43224194/article/details/143026336

相关文章

  • Maixpy k210开发板入门一
    Maixpyk210开发板入门一作者:福州大学切记我是一个温柔的刀客2024/10/171.Maixpydockk210背景Maixpy简介MaixPy是由Sipeed团队(中国深圳)开发的一个强大的嵌入式Python解释器,专为SipeedMaix系列开发板设计。它提供了丰富的功能和库,支持图像处理和机器学习,适......
  • WebSocket 教程合集指南,从入门到熟练
    WebSocket是一种在单个TCP连接上进行全双工通信的协议,相较于传统的HTTP协议,它减少了通信开销,更适合需要实时数据传输的场景。本文将带你从零开始,逐步掌握WebSocket的基本概念、实现方法和应用场景,通过一系列详细的教程和实践案例,帮助你从入门到熟练地使用WebSocket技术......
  • 小白怎么入门CTF,看这个就够了(附学习笔记、靶场、工具包下载)
     CTF靶场:CTF刷题,在校生备战CTF比赛,信安入门、提升自己、丰富简历之必备(一场比赛打出好成绩,可以让你轻松进大厂,如近期的各种CTF杯),在职人员可以工作意外提升信安全技能。渗透实战靶场:挖洞、渗透实战(web、域、横向渗透),适合实战能力需要大幅度提升的同学。一、CTF入门最近很多......
  • 用户画像-入门
    用户画像:用户画像是一种虚构的角色,它代表了理想用户的典型特征和行为。它是根据用户研究、数据分析和市场洞察构建的,旨在帮助企业更好地理解和服务其目标客户群体。用户画像通常包括用户的基本信息(如年龄、性别、职业、教育水平等)、兴趣爱好、消费习惯、生活方式、技术使用习惯......
  • 人工智能、深度学习和机器学习教程:从入门到精通
    人工智能、深度学习和机器学习教程:从入门到精通人工智能(AI)、深度学习(DL)和机器学习(ML)是当今最热门的技术领域,正在深刻地改变着我们的生活和工作方式。本文将全面介绍这些技术的基础知识、主要算法和实践应用,帮助读者从入门到精通。人工智能概述人工智能是计算机科学的......
  • 【C#】单元测试入门(XUnit 测试框架)
     本文示例环境VisualStudio2019XUnit 2.9.2单元测试框架xunit.runner.visualstudio2.2.0测试运行工具为什么要写单元测试 一个项目中,可能比较庞大。所以,使用测试,可以减少耦合,提升代码的质量。也可以让后续开发人员,快速了解代码。至于不写测试代码的原因有很多:比如......
  • vue入门案例-基本使用----非常适合初学者。言简意赅,没有废话。附带springboot+vue前后
    Listitemvue1.vue介绍渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的Web前端框架地址:https://cn.vuejs.org/什么是vue?Vue(发音为/vjuː/,类似view)是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明......
  • Python爬虫:获取数据的入门详解
    在互联网时代,数据已成为最宝贵的资源之一。Python,作为一种功能强大且易于学习的编程语言,成为了数据获取和处理的理想工具。Python爬虫,特别是,允许我们从网页中自动提取大量数据,为数据分析、机器学习、研究和开发等多种应用提供了原材料。本文将为您提供一个Python爬虫的入门详解......
  • ThreeJS入门(123):THREE.Skeleton 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第123篇入门文章......
  • 真正的小白入门篇(一),从点亮一颗灯开始
     更多电路设计,PCB设计分享及分析,可关注本人微信公众号“核桃设计分享”!回想起当年做过的愚蠢的事,居然把电源指示灯(LED)串到主回路里面一上电,然后LED就是这个下场了被自己蠢哭了虽然知识点很简单,难度堪比1+1=2,但我相信很多刚入门的小伙伴,也是对点灯电路中一些器件的选型......