首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

make vs $(MAKE) for submake在makefile中-有什么不同?

在Makefile中,make$(MAKE)都可以用来调用子Makefile,但它们的使用场景和行为有所不同。

基础概念

make:

  • make是一个命令行工具,用于自动化构建软件项目。
  • 当你在命令行中输入make时,它会查找当前目录下的Makefile,并执行其中的规则。

$(MAKE):

  • $(MAKE)是一个变量,它在Makefile中表示当前的make工具。
  • 使用$(MAKE)可以在Makefile中递归地调用子Makefile。

不同之处

  1. 调用方式:
    • make: 直接在命令行中使用,或者在Makefile中作为命令执行。
    • $(MAKE): 在Makefile中作为变量使用,通常用于递归调用子Makefile。
  • 递归调用:
    • 当你需要在Makefile中调用另一个Makefile时,应该使用$(MAKE)而不是make
    • 使用$(MAKE)可以确保递归调用时传递正确的上下文和环境变量。
  • 命令行参数:
    • 直接使用make时,可以在命令行中传递参数给Makefile。
    • 使用$(MAKE)时,可以通过$(MAKE) -f Makefile.sub这样的方式传递参数给子Makefile。

示例

假设你有一个主Makefile和一个子Makefile(submake.mk),你想在主Makefile中调用子Makefile。

主Makefile:

代码语言:txt
复制
all:
    $(MAKE) -f submake.mk

clean:
    $(MAKE) -f submake.mk clean

子Makefile (submake.mk):

代码语言:txt
复制
build:
    echo "Building subproject..."

clean:
    echo "Cleaning subproject..."

在这个例子中,$(MAKE)被用来调用submake.mk中的规则。

应用场景

  • 大型项目: 在大型项目中,可能会有多个子模块,每个模块都有自己的Makefile。使用$(MAKE)可以方便地在主Makefile中调用这些子Makefile。
  • 递归构建: 当你需要在一个项目中递归地构建多个层次的结构时,$(MAKE)是必要的。

遇到的问题及解决方法

如果你在使用$(MAKE)时遇到问题,比如子Makefile没有被正确调用,可能的原因包括:

  • 路径问题: 确保子Makefile的路径是正确的。
  • 环境变量: 检查是否有必要传递特定的环境变量给子Makefile。
  • 命令行参数: 如果需要传递参数给子Makefile,确保使用正确的语法。

解决方法:

  • 使用绝对路径或相对于当前Makefile的相对路径来指定子Makefile。
  • 使用export关键字在主Makefile中设置环境变量,然后在子Makefile中使用这些变量。
  • 确保传递给$(MAKE)的参数格式正确。

通过这种方式,你可以有效地管理和构建复杂的项目结构。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

make makefile cmake qmake都是什么,有什么区别?

其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖的文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex。...Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户),于是就有了跨平台项目管理工具cmake...5.makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。...11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形 12.接着是qmake,qmake是什么,先说一下Qt这个东西。...这样qmake和cmake有什么区别?

2.2K10

全民K歌后台编译优化:从40分钟到30秒

2.warning: -jN forced in submake: disabling jobserver mode 这个原因是由于递归调用的make进程里自己加了 –j选项,而不是直接使用MAKE变量...,比如设置了QMAKE=make –j 10, 在子进程里直接使用$(QMAKE) –f makefile来调用就会出现此问题,解决方法也很简单,去掉QMAKE变量,直接使用$(MAKE) –f makefile...目前想到的解决办法有三种: a. 使用make clean ;make all而不是make clean all,但是在cis上好像不支持 b....设置一个目标为clean_all,在makefile中把这个目标分成两个步骤,目前使用这个方案 ?...有ccache的情况下编译:30秒左右 ? 超越了之前定的在1分钟之内全部编译完的目标! 后续优化 1. 工程内同名文件清理 2.

1.8K50
  • 全民K歌后台编译优化:从40分钟到30秒

    2.warning: -jN forced in submake: disabling jobserver mode 这个原因是由于递归调用的make进程里自己加了 –j选项,而不是直接使用MAKE变量...,比如设置了QMAKE=make –j 10, 在子进程里直接使用$(QMAKE) –f makefile来调用就会出现此问题,解决方法也很简单,去掉QMAKE变量,直接使用$(MAKE) –f makefile...原因是递归调用的makefile里面直接使用了make –f makefile这样的形式,而没有使用MAKE变量,直接修改成$(MAKE) –f makefile就可以了。...目前想到的解决办法有三种: a. 使用make clean ;make all而不是make clean all,但是在cis上好像不支持 b....设置一个目标为clean_all,在makefile中把这个目标分成两个步骤,目前使用这个方案 ?

    1.5K70

    快速上手makefile自动化构建工具

    一个工程中的源文件非常多,其按照类型、模块等放在不同的目录下,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,以及重新编译等,甚至更复杂的操作。  ...清理项目   在vs中,我们既有生成资源,也有清理资源,那么在Linux下能否清理资源呢?答案是可以的。   ...现在我们既可以进行自动化编译,也可以进行自动化清理,例如:   为什么我们自动化编译只需要make,而资源清理却需要make clean?...我们不妨在makefile文件中将两者位置互换:   这时我们再进行make,我们会发现: 结论: make指令默认是makefile文件中的第一个依赖关系!...可以看到使用touch命令更改Mtime就可以重新make了 ✈️ 语法补充 .PHONY修饰   我们在windows的os下,vs中,编译文件之后不需要你手动清理资源,而是vs自动清理资源,那么在Linux

    14110

    【Linux必备工具】自动化构建工具makefile的使用详解

    前言 项目构建时遇到的各种挑战如文件编译顺序、库链接、依赖文件的管理等,在不同开发环境中会有不同的解决方案。...在 Visual Studio (VS) 环境中,这些问题往往被自动处理,运行直接 Ctrl + F5 就可以了,编译个项目非常轻轻松松。 但那是因为 VS 帮你自动维护了对应的项目结构!...Make和Makefile的基本概念 1.1 Make是什么?...可见,Makefile都成为了一种在工程方面的编译方法。 1.2 Makefile是什么? Makefile 是一个 文件。...在 Makefile 中,空行被视为分隔符,用于区分不同的规则或目标。 当 Make 工具解析 Makefile 文件时,它会忽略空行,并将第一行之后的非空行视为第一个规则或目标。

    22510

    Linux项目自动化构建工具-makeMakefile

    1.背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定...可见,makefile都成为了一种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。...2.make和makefile的演示 3.依赖关系和依赖方法 依赖关系:我为什么要帮你。 依赖方法:我怎么帮你。...因为会对时间进行一个对比,我们之间在VS上编译代码时,会发现我们解决了问题,但编译执行文件时依旧还是按照之前的程序执行,这就是因为VS识别文件不及时或者是没识别出来,还以为你的文件没有修改,所以他也没有对你的程序重新编译...我们发现其实上对比时间的工作是有make和makefile来做的,gcc并不关心。所以,当添加了这个伪目标后,make和makefile就默认不会对这个文件继续进行时间对比的操作。

    8110

    gdb和makefile的讲解

    Linux调试器-gdb使用 gdb可以用于Linux环境下的程序的调试,就例如vs环境下的打断点,然后逐步分析语句等 1 gdb的背景 程序的发布方式有两种,debug模式和release模式 我们在使用...vs21时大家都清楚,release版本是不能被调试的,而debug版本就是用于调试的程序版本 那么我们在Linux系统中默认生成的可执行程序是什么模式呢?.../Makefile 1 make/makefile的背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,...可见,makefile都成为了一种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。...在默认的方式下,也就是我们只输入make命令: 1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 2.

    15010

    Linux项目自动化构建清理工具-makeMakefile如何实现编译代码

    1、make和makefile有什么用?...makefile文件内容如上所示。 2.2输入make指令 然后我们直接保存退出makefile文件,然后在命令行直接输入make,就可以直接将test.c源文件变成可执行程序!...: 依赖关系:我为什么要帮你 依赖方法:怎么帮 具体实例: TIP: 1、Makefile和make形成目标文件的时候,默认是从上到下扫描makefile文件的。...我们可以在命令行用 vs + 文件名就可以添加文件进入分屏编写代码;然后CTRL+W就是替换不同的文件编写! 这里是多文件编译的时候,makefile文件书写的方式,这里是在同一个目录下的情况。...不同目录,make指令只会执行当前目录下的makefile文件!

    11410

    【Linux】Linux开发六大必备工具之安装、自动化构建、调试工具

    依赖于test.s,test.s依赖于test.i,test.i依赖于test.c,clean不依赖任何文件,然后在依赖关系的下一行table然后写明为什么依赖,也就是后面生成前面所需要的指令...当我们写好makefile文件后,直接输入make指令就可以把我们在makefile中实现的一键实现 当我们make clean一下,以iso为后缀的文件都被清理了 2、makefile的原理...(1)makefile产生可执行程序 以刚才的例子举例,当我们输入make指令时,make指令会在当前目录下寻找makefile/Makefile文件(开头大小写都可以,功能一样的),如果找到,它会找到文件中第一个目标文件...clean的都要make clean才能执行 并且make有一个保护效果,那就是在修改文件之前,禁止多次编译,也就是说make只能来一下,来一下之后你就要修改过源文件才能继续make,时间的比较机制是这样的...,一般我们用的第一个编译器是VS或者VScode,以VS为例,在学习过程中我们会学到一个能力叫做调试,调试成立的条件是建立在程序是以debug方式发布的 我们都知道程序的发布方式有两种,一种叫做

    4100

    【Linux】--- Linux编译器-gccg++、调试器-gdb、项目自动化构建工具-makeMakefile 使用

    编译(生成汇编): 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把c语言代码翻译成汇编语言。...可见,makefile都成为了一种在工程方面的编译方法; make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。...3.2 原理 make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么, make会在当前目录下找名字叫"Makefile"或"makefile"的文件。...2. make有自动推导的功能,所以 隐晦规则可以让我们比较粗糙地简略地书写makefile ,比如源文件与目标文件之间的时间关系判断之类。3....makefile中的伪对象表示对象名称并不代表真正的文件名,与实际存在的同名文件没有相互关系,因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。伪对象的作用有两个,1.

    43220

    在Bash编程中 set -e 与 trap exit ERR 有什么相同点和不同点

    在Bash编程中,set -e(或更正式地写作set -o errexit)和使用trap命令来捕获EXIT或ERR信号有相似的目的,即在脚本中检测错误并作出相应处理,但它们在行为和使用场景上有一些不同点...不同点 控制粒度: set -e提供的是全局性的错误处理机制,一旦任何命令失败,整个脚本立即终止。这可能导致在某些情况下过于严格,比如在预期某些命令可能会失败但希望后续命令继续执行的场景。...行为细节: set -e有一些例外情况不会导致脚本退出,比如在某些复合命令内部的失败,或者是失败命令出现在&&、||、if、while、until结构中。...trap 'exit ERR' ERR:同样广泛支持,但可能在某些非常旧的 shell 中不可用。...需要注意的是:在“进程替换”(process substitution)中执行的 exit 命令或因错误触发的陷阱,并不会终止外部进程,只会结束那个特定的子进程。

    23610

    Linux项目自动化构建工具-makeMakefile

    可见, makefile 都成为了一 种在工程方面的编译方法。 make 是一条命令, makefile 是一个文件,两个搭配使用,完成项目自动化构建。...如果在vs中写程序的时候,有100个源文件,那么我们是要把每个.c文件或者.cpp文件经过预处理,编译,汇编编译成.o文件 ,然后再把这些.o文件链接起来,生成1个或者多个可执行程序。...那么这些事情是编译器帮我们做的,那么在linux中就需要我们手动去做了,在linux中自动化构建项目的工具就是make/makefile。 2.理解 那么make是什么呢?...makefile又是什么呢? make是一个命令,makefile是一个文件。make是系统为我们提供的一个命令,而makefile是需要用户在当前工作目录下自己写的一个文件。...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理。

    12110

    C_C++_静态库_动态库的制作和使用

    为什么要写这个教程? 这个应用模型是我们在开发过程中经常使用的,例如:作为一名资深程序员,你需要为公司的应用开发工程师提供一个轮子:modbus通讯库。...当然,也顺带着介绍一些make+Makefile, cmake, VS2017等相关知识。...from=search&seid=2569462564675483069 教程中包含的内容 1....Linux平台下 动态库、静态库的编译和使用; 动态库和静态库的间接使用; 使用make + Makefile 来编译/构建动态库、静态库、应用程序; 使用cmake来编译/构建动态库、静态库、应用程序...Linxu平台 分别演示make + Makefile 和 cmake 来完成下面的操作: (1)libA输出动态库,libB输出动态库,编译可执行程序。

    1K10

    vscode基于Linux和Windows下cc++的多文件编译与连接

    前些天在配置Linux上的vscode的时候,突然发现有网友在tasks.json中的command是make,突然来了兴致,想到既然用make,那我只要一个makefile,然后Ctrl+Shift+...但最终make命令执行失败,说是找不到target什么的(忘了),但我不甘心,于是又是百度又是google,搜索了差不多两个小时都没有找到有效的解决方法。...看到shell命令也可以的时候感觉要吐血了,感觉我浪费了宝贵的两个小时,明明用shell脚本就变得很简单了,有多简单?看图 tasks.json ? .make.sh ?...简单吧,就是通过vscode将文件的目录${fileDirName}作为参数传给.make.sh,在脚本里进入这个目录后,再make一下就好了。...i bash --login -i -c "make -f %_makefile%" ::运行编译脚本MakeFile ::make 最后顺便贴一下我的makefile和launch.json吧 Linux

    3K70

    初识Linux · 有关makefile

    通过简单的介绍,我们知道了makefile是一个自动化命令工具,那么使用方法第一个是要创建makefile文件,makefile或者是Makefile都可以,我们在文件里面写入一些指令加上一点操作,我们就可以实现自动化指令了...2 makefile介绍 我们从makefile文件中的第一个点开始: 第一行的test:test.c,其中test:test.c成为构成了依赖关系,test叫做目标文件,test.c是被test依赖的...我们首先看看test.c的ACM时间: 这里为什么不让多次执行编译的命令就是因为makefile工具比较的是源文件和可执行文件的ACM时间,如果可执行文件和源文件的ACM时间,在修改上有差别,make检测到源文件更新了...以及,不同的自动化工具对于时间的判断是不一样的,比如我们平时使用的VS,有的时候出现bug,重新清理一下解决方案,再运行就可以了,大多数就是因为时间的判断准则出现问题了,此时清空解决方案就是为了更新一下可执行文件的...因为makefile执行方向就是从上往下进行执行的,所以我们直接make,默认执行的是第一个指令,那么我们换个位置: 此时make就是执行的第一个语句了。

    12410

    聊一聊鸿蒙的构建系统

    构建系统简介 这么些年的开发生涯中,接触过很多个软件构建系统。为什么开发软件需要构建系统呢? 回想一下我们刚开始学习编程,通常代码量比较小,编写的源代码只有几个文件。...但是,GNU Makefile 的编写极其繁琐和乏味,也容易出错。而且在涉及到多平台开发时,GNU Make 也有些力不从心。...AutoTool 工具通常只局限于类 Linux 系统中使用,CMake 更进一步,不仅可以生成 GNU Makefile,还可以生成 VS 工程文件,解决跨平台软件开发的问题。...接着 chromium 项目又整出了一个 Ninja 构建系统,但这个 Ninja 并不是用来取代 GYP,而是取代 GNU make 的,据谷歌官方的说法是速度有了好几倍的提升。...软件开发界有一句名言:不要重复造轮子,我们并不是什么东西都需要从头开发。

    1.5K20

    移植speexdsp到OpenHarmony标准系统①

    声学回声消除器回声消除是为了提高远端质量在任何免提通信系统中,远端语音通过本地扬声器播放。音频在房间内传播,并被麦克风捕获。如果从麦克风捕获的音频被直接发送到远程端,那么用户就会听到远端语音的回声。...重采样器在某些情况下将音频从一个采样率转换到另一个采样率。它可以用于混合具有不同采样率的流、用于支持声卡不支持的采样率、用于转码等。...Speexdsp在linux下的编译安装,在linux终端输入如下语句:安装make工具。...一般使用Makefile.am构建的三方库,原生库中存在autogen.sh,configure.ac文件。由makefile.am自动生成makefile。./autogen.sh....编译出全部测试功能用的可执行文件如下:写在最后如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;关注小编,同时可以期待后续文章ing,不定期分享原创知识

    21220

    Mac VS CODE 无法 ssh-remote

    更新依然无法连接.绕过密码验证第二次尝试, 查看ssh-Remote连接时使用的命令.在VS Code中的Terminal中可以得到连接中使用的命令ssh -v -D 51465 -o ConnectTimeout...疑点ssh的参数到底调整了什么在Terminal中所有的参数都是可以正常使用的, 但是在VS Code中除了-v以外的所有参数都会报错....可能是由于-v是查看详细信息, 所以对连接过程无影响.在使用公钥连接而非密码之后, 理应绕过了/dev/tty权限的问题, 但-D/-o的命令只要添加, 就会报错.为什么成功了一次最大的疑惑就是为什么在...VS Code失败的情况下为什么VS Code Insider成功了第一次, 但是之后我在删除所有插件, 更换旧版本乃至删除服务器.vscode文件夹都毫无反应.实在是分不清啊...automake是什么...GNU Automake是一种编程工具,可以产生供make程序使用的Makefile,用来编译程序。

    1.1K20

    【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )

    NDK 项目 一、Visual Studio 中创建 Makefile 项目 ---- 在 Visual Studio 2019 欢迎界面中 , 选择 " 创建新项目 " ; 在 " 创建新项目 "...: make -f Makefile.mk 清除命令行 : make -f Makefile.mk clean 重新生成命令行 : make -f Makefile.mk -B 如果 Windows...make 命令 ; 这是编译 NDK 项目的通用 Makefile 配置 : 使用前只需要修改 NDK 和 NDK_ROOT 中的自己的 NDK 即可 ; NDK = D:/001_Develop/...int argc, char** argv) { printf("Hello World"); return 0; } 六、编译 NDK 项目 ---- 右键点击 " 解决方案资源管理器 " , 在弹出的菜单中..., 选择 " 仅用于项目(J) -> 仅生成 VS_NDK_Makefile(B) " 选项 ; 编译结果 :

    62030
    领券