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