【问题标题】:Dependencies not being made in makefile未在 makefile 中创建依赖项
【发布时间】:2014-08-17 18:02:51
【问题描述】:

我一直在尝试让以下 makefile 工作。

INCLUDE=Include/
LIBRARY=Lib/
CC=g++

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
    LIBRARIES=-lGLEW -framework OpenGL -framework GLUT
else
    LIBRARIES=-lGL -lglut -lGLEW
endif

SRC := $(shell find -name *.cpp | tr '\n' ' ')

all: release debug

.PHONY: init

init:
    @mkdir -p build/release/object
    @mkdir -p build/debug/object

debug: init
debug: CC = g++ -g
debug: BUILD_DIR = build/debug
debug: makegeneral

release: init
release: CC = g++
release: BUILD_DIR = build/release
release: makegeneral

makegeneral: OBJ = $(SRC:./src/%.cpp=$(BUILD_DIR)/object/%.o)
makegeneral: $(OBJ)
    $(CC) -I$(INCLUDE) -L$(LIBRARY) $(OBJ) $(LIBRARIES) -o VoxPop   
    @rm -rf $(BUILD_DIR)/shaders
    @mkdir -p $(BUILD_DIR)/shaders
    @cp -r src/shaders/* $(BUILD_DIR)/shaders

$(BUILD_DIR)/object/%.o: src/%.cpp
    $(CC) -I$(INCLUDE) -L$(LIBRARY) -o $@ -c $<

.PHONY: clean
clean:
    @rm build/debug/object/* build/release/object/*

本质上,它设置了一些特定于调试构建和发布构建的变量,然后调用一个公共目标,makegeneral。当我运行 make 时,我得到以下输出:

g++ -IInclude/ -LLib/ build/release/object/VoxPop.o build/release/object/Utils.o -lGL -lglut -lGLEW -o VoxPop   
g++: error: build/release/object/VoxPop.o: No such file or directory
g++: error: build/release/object/Utils.o: No such file or directory
make: *** [makegeneral] Error 1

当我在 makegeneral 开头回显 SRC 和 OBJ 时,它们似乎是正确的。似乎问题出在 makegeneral 的依赖项上,因为编译目标文件的规则从未被调用,也没有“No rule to make target...”消息吐出。

作为参考,这是我在 makegeneral 开头回显 SRC 和 OBJ 时得到的。

SRC: ./src/VoxPop.cpp ./src/Utils.cpp
OBJ: build/release/object/VoxPop.o build/release/object/Utils.o

【问题讨论】:

  • 我相信换行符tr 是不必要的。无论哪种方式,变量都将包含相同的列表(至少就 make 关心的内容而言)。

标签: linux macos makefile


【解决方案1】:

BUILD_DIR 未设置在顶层,因此扩展为模式规则中的空字符串。这也是(我相信)为什么 make 在不可构建的先决条件上没有失败的原因。甚至没有任何关于如何做到这一点的规则(除了内置规则)。 (虽然我目前无法使用带有 make 的机器来测试我的理论。)

我也不相信(尽管我目前无法测试)make 会在此配置中运行您的 makegeneral 目标两次以获得您想要的。我相信你只会让它运行一次,无论哪个目标 make 选择首先构建(我相信在这种情况下是第一个列出的 release)。

【讨论】:

  • 你似乎是对的。我明确地将事情分开而不是使用单个 makegeneral 目标,现在一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2016-09-14
  • 2012-09-28
  • 2018-04-05
  • 2015-11-07
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多