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

C++ Makefile missing separator in .dep

本文关键字:分隔符 C++Makefile 中的 dep      更新时间:2023-10-16

在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,^(.*).os*:,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 $@/>$@。在原始文件中有一个echo-n,但在OS X上不起作用。

好吧,让我们稍微清理一下。

依赖关系的处理方式确实很糟糕,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预处理器标志将在编译时自动生成依赖文件了解更多信息

  • CCD_ 11用于链接器标志,例如CCD_。

  • $(LDLIBS)用于链接器库,例如-l标志

  • 避免使用$(shell )函数,因为当使用=运算符而不是:=运算符赋值时,每次扩展变量时都会执行该函数。$(wildcard )更适合于列出文件的工作。