使文件从同一源文件构建所有对象文件

时间:2016-10-10 22:08:53

标签: c++ c++11 makefile

我有一个包含obj和src子文件夹的项目。

当我使用以下Makefile运行make时,它使用相同的src构建每个.o。

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但是抱怨没有$(SRCDIR)/%的配方.cc

如何将每个src文件构建为相应的src文件?

1 个答案:

答案 0 :(得分:0)

为此:

$(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个不同的规则来构建你的对象(除非我读错了)。