【问题标题】:GNU Make seems to skip prerequisitesGNU Make 似乎跳过了先决条件
【发布时间】:2017-02-12 21:47:41
【问题描述】:

我有一个基本的、最小的 makefile 来编译 C++ 源代码;精简版如下所示:

TARGET = main

OBJ = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
CPPFLAGS = -std=c++11 -Wall

build: $(TARGET)

$(TARGET): $(OBJ)
    @echo "$? --> $@"
    g++ $(CPPFLAGS) -o $@ $?
    @echo

%.o: %.cpp
    @echo "$< --> $@"
    g++ $(CPPFLAGS) -c $<
    @echo

从头开始构建时,一切都按预期工作:

clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp

main.cpp --> main.o
g++ -std=c++11 -Wall -c main.cpp

clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o

在其中一个源文件发生更改后,make 会重建相应的目标文件,但由于某种原因在尝试链接时会跳过现有(未更改的)目标文件(clock.o --&gt; main 而不是clock.o main.o --&gt; main):

clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp

clock.o --> main
g++ -std=c++11 -Wall -o main clock.o

再次运行make 时,不更改任何文件,链接按预期工作:

clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o

这种行为的原因是什么,如何预防?

我在 i686 Linux 4.4 上运行 GNU Make 4.1

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    您在 g++ $(CPPFLAGS) -o $@ $? 配方中使用了错误的自动变量。 https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html:

    $?

    比目标更新的所有先决条件的名称, 它们之间有空格。

    所以 Make 完全按照您的要求做:从所有更新的先决条件链接主要目标并跳过未触及的先决条件。

    g++ $(CPPFLAGS) -o $@ $^ 配方将解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2021-04-09
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多