C++ Makefile липсва разделител в .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,^(.*)\.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/

Тъй като знам много малко за makefiles (и не съм написал публикувания), всяка помощ ще бъде оценена.

P.S. Промених реда printf dirname $@/ > $@. В оригиналния файл имаше echo -n, но това не работи на OS X.


person Heribert    schedule 15.05.2014    source източник
comment
Е, файловете, които са included в makefile, трябва да бъдат в makefile синтаксис, което вашият .dep файл със сигурност изглежда не е. Няма начин да знаем как трябва да изглежда, но...   -  person twalberg    schedule 15.05.2014
comment
опитайте да стартирате make clean, за да почистите повредени .dep файлове...   -  person Chris Dodd    schedule 16.05.2014


Отговори (1)


Е, нека изчистим това малко.

Начинът, по който се обработват зависимостите, наистина е грозен, 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) вместо $(CC), който се използва за C код.

  • Заедно с това трябва да използвате $(CXXFLAGS) вместо $(CFLAGS).

  • $(CPPFLAGS) е предназначен за флагове на препроцесора (-I, -D или -fopenmp, което е флаг по време на компилиране).

  • Флаговете на препроцесора -MMD -MP автоматично ще генерират файлове на зависимости при компилиране. Научете повече .

  • $(LDFLAGS) е предназначен за флагове за свързване като флагове -L.

  • $(LDLIBS) е предназначен за библиотеки на линкери като -l флагове

  • Избягвайте да използвате функцията $(shell ), тъй като тя ще се изпълнява всеки път, когато променливата се разшири, когато е зададена с оператора = вместо оператора :=. $(wildcard ) е по-подходящ за работата по изброяване на файлове.

person Chnossos    schedule 15.05.2014
comment
Първо благодаря много за отговора и подробното обяснение. Много помогна за разбирането на файла. Ако сега се опитам да изградя, получавам fatal error: 'omp.h' file not found'. Намерих тази връзка което би трябвало да е проблема. Инсталирах gcc с помощта на brew и добавих CC := gcc-4.8 към make-файла. Въпреки това, същата грешка, както преди, възниква при изграждането на проекта. - person Heribert; 16.05.2014
comment
Както казах по-горе в моя отговор, трябва да използвате променливата CXX, а не CC. Освен това, тъй като вашият проект използва C++, трябва да използвате g++, а не gcc. За да ми позволите да ви помогна по-лесно, трябва да редактирате въпроса си и да добавите няколко информации като вашата операционна система/дистрибуция, откъде сте взели своя Makefile на първо място, и да добавите целия резултат, когато използвате make. - person Chnossos; 16.05.2014
comment
Отново бяхте прав :) Замяната на CC с CXX и gcc-4.8 с g++-4.8 свърши работа. Тогава имах само проблема, че GL/gl.h не беше намерен. Въпреки това, тъй като тази връзка обяснява, е необходима проста замяна на GL с OpenGL на Mac. Сега, с изключение на някои грешки при компилиране, проектът се изгражда и затова считам този проблем за решен. Благодаря отново за помощта :) - person Heribert; 17.05.2014