【发布时间】: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 关心的内容而言)。