在OS X Mavericks上我正在尝试使用以下Makefile构建项目:
CC=g++
EXECUTABLE=minigi
SRC_DIR=src
INTERM_DIR=obj
INCLUDES=-I $(SRC_DIR) -I /usr/local/Cg/examples/OpenGL/glew/include/
LIBS=-L/usr/local/lang/NVIDIA_GPU_Computing_SDK/sdk/C/common/lib/linux/ -lpng -stdc++ -lGL -lGLU -lGLEW -lSDLmain -lSDL -lgomp
CFLAGS_COMMON=$(INCLUDES)
CFLAGS=$(CFLAGS_COMMON) -O3 -DNDEBUG -fopenmp
#CFLAGS=$(CFLAGS_COMMON) -g -O0 -D_DEBUG
SOURCE_FILES=$(shell find $(SRC_DIR) -iname '*.cpp')
DEP_FILES=$(SOURCE_FILES:$(SRC_DIR)/%.cpp=./$(INTERM_DIR)/%.dep)
OBJ_FILES=$(SOURCE_FILES:$(SRC_DIR)/%.cpp=./$(INTERM_DIR)/%.o)
all: $(EXECUTABLE)
clean:
rm -rf obj $(EXECUTABLE)
.PHONY: clean all
.SUFFIXES:
.SUFFIXES:.o .dep .cpp .h
$(INTERM_DIR)/%.dep: $(SRC_DIR)/%.cpp
mkdir -p `dirname $@`
printf `dirname $@`/ > $@
$(CC) $(CFLAGS_COMMON) $< -MM | sed -r -e 's,^(.*)\.o\s*\:,\1.o $@ :,g' >> $@
ifneq ($(MAKECMDGOALS),clean)
-include $(DEP_FILES)
endif
$(INTERM_DIR)/%.o: $(SRC_DIR)/%.cpp
mkdir -p $(INTERM_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(EXECUTABLE): $(OBJ_FILES)
$(CC) $^ $(LIBS) -o $@
然而,当我输入make时,我收到以下错误:
obj/app/sdl_gl_appliacation.dep:1: *** missing separator. Stop.
文件obj / app / sdl_gl_application.dep如下所示:
-n obj/app/
由于我对makefile很少了解(并且没有写过发布的文件),我们将不胜感激。
P.S。
我修改了行printf dirname $@
/&gt; $ @。在原始文件中有一个echo -n但是在OS X上不起作用。
答案 0 :(得分:3)
好吧,让我们稍微清理一下。
处理依赖关系的方式确实很难看,GCC可以自动为你完成。
EXECUTABLE := minigi
SRC_DIR := src
OBJ_DIR := obj
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES := $(SRC_FILES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
DEP_FILES := $(OBJ_FILES:.o=.d)
LDLIBS := -lpng -lstdc++ -lGL -lGLU -lGLEW -lSDLmain -lSDL -lgomp
LDFLAGS := -L/usr/local/lang/NVIDIA_GPU_Computing_SDK/sdk/C/common/lib/linux/
CPPFLAGS := -MMD -MP -DNDEBUG -fopenmp -I $(SRC_DIR) -I /usr/local/Cg/examples/OpenGL/glew/include/
CXXFLAGS := -O3
.PHONY: all clean
all: $(EXECUTABLE)
clean:
$(RM) -r $(OBJ_DIR) $(EXECUTABLE)
$(EXECUTABLE): $(OBJ_FILES)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(OBJ_DIR):
mkdir $@
ifeq "$(MAKECMDGOALS)" ""
-include $(DEP_FILES)
endif
一些快速说明:
您正在使用C ++,因此您应该使用$(CXX)
代替用于C代码的$(CC)
。
除此之外,您还应使用$(CXXFLAGS)
代替$(CFLAGS)
。
$(CPPFLAGS)
适用于预处理程序标志(-I
,-D
或-fopenmp
,它是编译时标志。)
-MMD -MP
预处理程序标志将在编译时自动生成依赖项文件。 Learn more
$(LDFLAGS)
适用于-L
标记等链接器标记。
$(LDLIBS)
适用于链接器库,例如-l
标志
避免使用$(shell )
函数,因为每次扩展变量时都会执行该函数,而不是使用=
运算符而不是:=
运算符。 $(wildcard )
更适合列出文件的工作。