GNU make在新创建的子目录

时间:2017-06-02 18:14:33

标签: makefile gnu-make

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

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

我的麻烦在于正确构建新子目录中的.o文件。我找到的解决方案是

$(NOW)%.o: $(NOW)%.cpp $(CC) -c $(FLAGS) $<

其中$(NOW)$是子目录名称。问题是我的$(FLAGS)似乎被忽略了:输出大致是

g++ -c -o <.o file> <.cpp file>

(是的,g++-c之间实际上有额外的引入空间。)而在顶层目录中构建了一个

%.o: %.cpp $(CC) -c $(FLAGS) $<

正确输出

g++ -c <my flags> -o <.o file> <.cpp file>

总而言之,我无法通过将源文件传输到新创建的子目录并在该目录中构建.o文件来正常编译。 TYIA。

1 个答案:

答案 0 :(得分:-1)

Ad John指出,使用您提供的一小段makefile无法明确诊断您的问题,因为错误不在您提供的代码中,而是在其他部分你的makefile。理想情况下你需要提供一个SSCCE,但如果没有,那么至少我们需要看看如何设置NOW变量和链接器规则,以便我们知道make正在尝试构建什么。

我还应该指出,按照惯例,你不应该使用CC来保存C ++编译器; CC变量保存C编译器。使用CXX表示C ++编译器,CXXFLAGS表示C ++编译器标志。

一种可能性是您使用递归赋值分配NOW变量,以便每次评估变量时都会重新创建时间戳;可能是时间戳在makefile的生命周期内发生变化。

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

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

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

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

$(NOW)%.o : $(NOW)%.cpp
        $(CXX) ...

然后您的模式将无法匹配,因为make正在尝试构建文件foo.o,而您的规则告诉它如何构建$(NOW)foo.o这些不同的东西。