2017-06-02 96 views
-1

首先 - 我知道有很多类似的讨论,但我花了几个小时没有他们为我工作。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。

+2

发布'$(FLAGS)'设置的行。如果它是一个特定于目标的变量,那么这可能会导致您描述的问题。另外,如果它是使用':='设置的,并且是'$(NOW)%。o'目标下的,那么它的值将不会在该规则中生效。更完整的makefile会明确帮助诊断问题。 – blackghost

回答

-1

Ad John指出,没有办法用您提供的makefile的一小部分来明确诊断您的问题,因为错误不在您提供的代码中,而是在makefile的其他部分。理想情况下,您需要提供SSCCE,但如果不是这样,那么至少我们需要了解如何设置NOW变量以及链接器规则,以便我们知道制作尝试构建的内容。

我还应该指出,按照惯例,您不应该使用CC来保存C++编译器; CC变量包含C编译器。对于C++编译器使用CXX,对于C++编译器标志使用CXXFLAGS

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

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

因此,举例来说,如果你的链接线看起来是这样的:

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

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

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

那么你的格局不会匹配,因为提出的是试图建立档案foo.o和您的规则告诉它如何构建$(NOW)foo.o这是不是一回事。