Makefile 子目录和生成文件

Makefile 子目录和生成文件,makefile,Makefile,我想这是一个被问了很多次的问题,但我找不到正确的方法 我的结构如下: project/ project/Makefile project/code project/code/*.cc project/code/Makefile 当我在“project/code”目录中并调用“makeproject\u code”时,我的代码编译正确 当我在‘project/’中时,我想这样做,就像在‘project/code’中一样,只调用‘makeproject_-code’ makefile“projec

我想这是一个被问了很多次的问题,但我找不到正确的方法

我的结构如下:

project/
project/Makefile
project/code
project/code/*.cc
project/code/Makefile
当我在“project/code”目录中并调用“makeproject\u code”时,我的代码编译正确

当我在‘project/’中时,我想这样做,就像在‘project/code’中一样,只调用‘makeproject_-code’


makefile“project/makefile”将包含其他规则(如“install”)和一些要编译的规则,就像我在“project/code”中一样。为此,我请求你的帮助。。。谢谢。

尝试将此规则放入project/Makefile中,如下所示(对于GNU make):

.伪造:项目代码 项目代码: cd代码和制作(&M)
最简单的方法是:

CODE_DIR = code

.PHONY: project_code

project_code:
       $(MAKE) -C $(CODE_DIR)
.PHONY
规则意味着
project\u code
不是需要生成的文件,
-C
标志表示目录中的更改(相当于在调用
make
之前运行
cd code
)。您可以使用相同的方法调用
code
Makefile中的其他目标

例如:

clean:
       $(MAKE) -C $(CODE_DIR) clean

谢谢,它很管用!最后一件事:$(MAKE)总是被定义吗?$(MAKE)是对您定义的变量的引用吗?或者这是一个始终存在的内置函数?它内置于GNU Make中,请参阅手册:是否有方法抑制此调用的输出@$(MAKE)无法按预期工作。如何对多个子目录执行此操作?当我尝试将另一个子目录目标附加到PHONY时,只运行第一个目标。这不会像编写的那样工作,因为在GNU make中,默认情况下,规则体的每一行都在不同的shell中执行。因此,cd将出现,但执行它的shell将立即退出;然后,“make”将单独执行。事实上,我相信这将使make进入一个无限递归循环。但是,如果您将代码更改为“cd代码和制作”,它将按预期工作。4年后编辑以匹配suggestion@EmanueleCipolla又过了四年,竖起大拇指向圣灵致敬。现在我们离这一天已经差不多四年了,这再次证明了
make
是一个永恒的软件,正确的
Makefile
写作应该是每一门基本的计算机技能课程的一部分。
clean:
       $(MAKE) -C $(CODE_DIR) clean