Создание файла, создающего все объектные файлы из одного исходного файла

#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 разных правила для создания ваших объектов (если я не ошибаюсь).