gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:19 24 4
gpt4 key购买 nike

在 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 知之甚少(也没有编写已发布的),我们将不胜感激。

附言我修改了行 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 预处理器标志将在编译时自动生成依赖文件。 Learn more .

  • $(LDFLAGS) 用于链接器标志,例如 -L 标志。

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

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

关于C++ Makefile 在 .dep 中缺少分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com