#c #c 11 #makefile
#c #c 11 #makefile
Вопрос:
У меня есть проект, который содержит вложенную папку obj и src.
Когда я запускаю make со следующим Makefile, он создает каждый файл .o с тем же src.
CXX = g
CXXINCDIRS = -I./ext/glui/include -I.
CXXLIBDIR = /usr/lib/
SRCDIR = ./src
OBJDIR = ./obj
INCDIR = ./include
BINDIR = ./bin
EXE = $(BINDIR)/brushwork
CXXFLAGS = -W -Wall -Wextra -Weffc -std=c 11 $(CXXINCDIRS)
SRC_CXX = $(wildcard $(SRCDIR)/*.cc)
OBJECTS_CXX = $(patsubst $(SRCDIR)/%.cc, $(OBJDIR)/%.o, $(SRC_CXX))
LIBRARY_CXX = -lglut -lGL -lGLU -L/usr/lib -lglui
$(OBJDIR)/%.o: $(SRCDIR)/%.cc
g -o $@ -c $<
$(EXE): $(OBJECTS_CXX) | $(BINDIR)
$(CXX) $(CXXFLAGS) $(CXXINCDIRS) -o $@ $^ $(CXXLIBDIR) $(LIBRARY_CXX)
$(OBJECTS_CXX): $(SRC_CXX) | $(OBJDIR)
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(OBJDIR)/%.o: $(SRC_CXX) $(INCDIR)/%.h | $(OBJDIR)
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(BINDIR) $(OBJDIR):
mkdir -p $@
Когда я запускаю команду
make -B -n
Я получаю
mkdir -p obj
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -c -o obj/tool.o src/tool.cc
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -c -o obj/base_gfx_app.o src/tool.cc
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -c -o obj/color_data.o src/tool.cc
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -c -o obj/main.o src/tool.cc
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -c -o obj/pixel_buffer.o src/tool.cc
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -c -o obj/brushwork_app.o src/tool.cc
mkdir -p bin
g -W -Wall -Wextra -Weffc -std=c 11 -I./ext/glui/include -I. -I./ext/glui/include -I. -o bin/brushwork obj/tool.o obj/base_gfx_app.o obj/color_data.o obj/main.o obj/pixel_buffer.o obj/brushwork_app.o /usr/lib/ -lglut -lGL -lGLU -L/usr/lib -lglui
Я не уверен, почему каждый obj-файл создается с одним и тем же файлом src.
Я пробовал $(SRCDIR)/%.cc, но make жалуется, что нет рецепта для $ (SRCDIR)/%.cc
Как я могу заставить make создавать для каждого файла src соответствующий файл src?
Ответ №1:
Для этого:
$(OBJDIR)/%.o: $(SRC_CXX) $(INCDIR)/%.h | $(OBJDIR)
$(CXX) $(CXXFLAGS) -c -o $@ $<
Я думаю, вам это нужно:
$(OBJDIR)/%.o: $(SRCDIR)/%.cc $(INCDIR)/%.h
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
Я не уверен, что это делает:
$(OBJECTS_CXX): $(SRC_CXX) | $(OBJDIR)
$(CXX) $(CXXFLAGS) -c -o $@ $<
Я подозреваю, что вам следует его удалить.
И я думаю, вам также следует удалить это:
$(OBJDIR)/%.o: $(SRCDIR)/%.cc
g -o $@ -c $<
Похоже, у вас было 3 разных правила для создания ваших объектов (если я не ошибаюсь).