【问题标题】:GNU make in newly created subdirectoryGNU make 在新创建的子目录中
【发布时间】:2017-06-02 18:14:33
【问题描述】:

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

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

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

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

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

g++ -c -o &lt;.o file&gt; &lt;.cpp file&gt;

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

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

正确输出

g++ -c &lt;my flags&gt; -o &lt;.o file&gt; &lt;.cpp file&gt;

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

【问题讨论】:

  • 发布设置$(FLAGS) 的行。如果它是特定于目标的变量,那么这可能会导致您描述的问题。此外,如果它使用:= 设置并且低于 $(NOW)%.o 目标,那么它的值将不会在该规则中生效。更完整的 makefile 肯定有助于诊断问题。

标签: makefile gnu-make


【解决方案1】:

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

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

一种可能性是您正在使用递归分配分配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,这不是一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多