如何处理makefile中依赖项的重命名操作? 我在使用Linux命令构建Linux上的一个简单的C++应用程序。我想用两个不同的头文件定义的不同信息集测试代码:define.h和define.hh

如何处理makefile中依赖项的重命名操作? 我在使用Linux命令构建Linux上的一个简单的C++应用程序。我想用两个不同的头文件定义的不同信息集测试代码:define.h和define.hh,c++,makefile,C++,Makefile,“define.h”是我的构建系统中唯一使用的一个,并且正确定义了依赖项 编辑“define.h”时,make将重建项目 当我使用terminal交换“define.h”和“define.hh”的名称时,make并不费心重建 main.cpp: #include "define.h" #include <iostream> int main() { std::cout << MSG << std::endl; } define.hh: #define

“define.h”是我的构建系统中唯一使用的一个,并且正确定义了依赖项

编辑“define.h”时,make将重建项目

当我使用terminal交换“define.h”和“define.hh”的名称时,make并不费心重建

main.cpp:

#include "define.h"
#include <iostream>
int main()
{
    std::cout << MSG << std::endl;
}
define.hh:

#define MSG "2"
生成文件:

CPPFLAGS:=-g
LDLIBS:=-lstdc++

main: main.o

main.o: main.cpp define.h

使用VSCode GUI交换“define.h”和“define.hh”的名称后,make将重建项目

在终端中重命名文件似乎不会更新其时间戳,但VSCode会在重命名操作后更新时间戳

在我的makefile中有没有处理这种情况的方法

我们是否应该期待make在未来变得更聪明并处理好这种情况?(如兑现有关文件节点的信息)

这应该是操作系统标准的一部分吗?(如重命名后更新时间戳,或为重命名定义新的时间戳)

您可以运行
重命名后触摸
。这将更新修改时间戳

编辑:实现所需的另一个选项是拥有两个文件
define1.h
define2.h
,并根据哪个make将决定使用哪个make向make命令添加参数。 您可以这样运行make:
maketargetdefineh=1
maketargetdefineh=2
在makefile中:

ifeq($(定义),1)
cp define1.h define.h
触摸定义
else ifeq($(定义),2)
cp define2.h define.h
触摸定义
endif

这样,您将永远不会忘记触摸文件。

您可以运行
重命名后触摸
。这将更新修改时间戳

编辑:实现所需的另一个选项是拥有两个文件
define1.h
define2.h
,并根据哪个make将决定使用哪个make向make命令添加参数。 您可以这样运行make:
maketargetdefineh=1
maketargetdefineh=2
在makefile中:

ifeq($(定义),1)
cp define1.h define.h
触摸定义
else ifeq($(定义),2)
cp define2.h define.h
触摸定义
endif


这样,您将永远不会忘记触摸文件。

您需要确保触摸重命名的
define.h
文件(即
define.hh
)以显示它是新的,依赖它的内容需要重新编译。OTOH,我不认为这是一种好的操作方式。下面是你第一个问题的答案(有没有处理方法)。第二个问题的答案是(IMO)“否”。如果通过使用两个单独的make目标正确地触发重新编译来传递
-DMSG=“1”
(和2),那么这可能是一个选项。虽然不确定是否有,但我猜应该有。@super您能提供一个关于-DMSG选项的链接或一些信息吗?它列在最上面的列表中。它没有提供更多的信息,但是我想这就是你所需要的。如果您在命令行上尝试它,您可能需要转义引号,
-DMSG=\“1\”
您需要确保重命名的
define.h
文件(即
define.hh
)被触摸,以显示它是新的,依赖它的内容需要重新编译。OTOH,我不认为这是一种好的操作方式。下面是你第一个问题的答案(有没有处理方法)。第二个问题的答案是(IMO)“否”。如果通过使用两个单独的make目标正确地触发重新编译来传递
-DMSG=“1”
(和2),那么这可能是一个选项。虽然不确定是否有,但我猜应该有。@super您能提供一个关于-DMSG选项的链接或一些信息吗?它列在最上面的列表中。它没有提供更多的信息,但是我想这就是你所需要的。如果您在命令行上尝试,您可能需要避开引号,
-DMSG=\“1\”
这个答案也是一个不错的选择,但是当make说所有内容都是最新的时,您仍然不能信任它,因为您可能在过去犯过错误,并且未经触摸就重命名了文件。如果没有其他答案,我会接受这个答案。编辑答案以解决忘记触摸的问题。触摸对于开发人员来说非常重要,以防他们使用可能不会更新其时间戳的文件进行操作(感谢Nellie)。我不确定是否要从makefile中进行触摸,但我接受它,因为可能存在您无论如何都要重建某些内容的情况,并且不会花费太多时间或过程。此外,这个答案是一个不错的选择,但当make说所有内容都是最新的时,您仍然不能信任它,因为您可能在过去犯过错误,未经触摸就重命名了文件。如果没有其他答案,我会接受这个答案。编辑答案以解决忘记触摸的问题。触摸对于开发人员来说非常重要,以防他们使用可能不会更新其时间戳的文件进行操作(感谢Nellie)。我不确定是否要从makefile中进行触摸,但我接受它,因为在某些情况下,您可能希望重建某些东西,而且它不会花费太多时间或过程。
CPPFLAGS:=-g
LDLIBS:=-lstdc++

main: main.o

main.o: main.cpp define.h