C ++ Makefile在.dep中缺少分隔符

时间:2014-05-15 18:44:52

标签: c++ makefile

在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上不起作用。

1 个答案:

答案 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 )更适合列出文件的工作。