.dep中的C++Makefile缺少分隔符
C++ Makefile missing separator in .dep
在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 )
更适合于列出文件的工作。
相关文章:
- 当用户键入分隔符时,停止getline()输入
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 针对遗留库的链接:来自预制makefile的-lgfortranbegin
- 如何在 c++ 中使用 ',' 作为 getline 分隔符
- 带有多个字符分隔符的正则表达式
- 使用 Makefile 中的头文件编译 Pybind (不使用 cmake)
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 字符串开头的分隔符
- 如何在使用Makefile构建后在cmd中运行该程序?
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 尝试将 c 字符串数组与分隔符连接起来
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 如何在macOS上使用Makefile?
- 根据新的行分隔符从字符串中删除子字符串
- 同一分隔符之间的多个子字符串
- Makefile:Foreach 和 eval 缺少分隔符?
- Makefile中扩展正则表达式列表的分隔符
- Makefile语法错误.缺少分隔符
- .dep中的C++Makefile缺少分隔符