Makefile GNU在新创建的子目录中生成

Makefile GNU在新创建的子目录中生成,makefile,gnu-make,Makefile,Gnu Make,首先,我知道有很多类似的讨论,但我花了好几个小时没有他们为我工作 我的makefile首先创建一个以当前日期和时间命名的目录。然后,我让makefile在头文件中附加一行,该行创建一个具有此目录名的字符串。出于这个原因,我首先需要将所有源文件(包括头文件)复制到新创建的子目录中,这样我就可以保留原始头文件,并且只修改将用于编译的头文件(在子目录中)。然后我想在这个新目录中构建 我的问题是让make在新的子目录中正确地构建.o文件。我找到的解决办法是 $(现在)%.o:$(现在)%.cpp $(C

首先,我知道有很多类似的讨论,但我花了好几个小时没有他们为我工作

我的makefile首先创建一个以当前日期和时间命名的目录。然后,我让makefile在头文件中附加一行,该行创建一个具有此目录名的字符串。出于这个原因,我首先需要将所有源文件(包括头文件)复制到新创建的子目录中,这样我就可以保留原始头文件,并且只修改将用于编译的头文件(在子目录中)。然后我想在这个新目录中构建

我的问题是让make在新的子目录中正确地构建
.o
文件。我找到的解决办法是

$(现在)%.o:$(现在)%.cpp

$(CC)-c$(FLAGS)$Ad John指出,对于您提供的一小部分makefile,无法最终诊断您的问题,因为错误不在您提供的代码中,而是在makefile的其他部分。您需要提供一个理想的,但如果不是这样,那么至少我们需要了解
NOW
变量是如何设置的,以及链接器规则,以便我们知道make正在尝试构建什么

<>我也应该指出,按照惯例,你不应该使用<代码> cc>代码来保存C++编译器;
CC
变量保存C编译器。对于C++编译器,使用< C++ >代码> CX> <代码> > C++编译器标志> < /P> 一种可能性是,您现在使用递归赋值来赋值
变量,以便每次求值变量时都重新创建时间戳;时间戳可能在makefile的生命周期内发生变化

另一个非常常见的问题是您创建了模式规则,但是make没有使用它,因为make想要构建的目标与模式不匹配

例如,如果您的链接行如下所示:

SRCS = foo.cpp
OBJS = $(SRC:.cpp=.o)

myprog: $(OBJS)
        $(CXX) ...

$(NOW)%.o : $(NOW)%.cpp
        $(CXX) ...
然后,您的模式将不匹配,因为make正在尝试构建文件
foo.o
,而您的规则告诉它如何构建
$(现在)foo.o
,它们不是同一件事。

在设置
$(标志)
的地方张贴行。如果它是一个特定于目标的变量,那么这可能会导致您所描述的问题。此外,如果它是使用
:=
设置的,并且低于
$(现在)%.o
目标,则其值在该规则中不会生效。一个更完整的makefile肯定有助于诊断问题。