带有源子目录的单个顶级makefile

时间:2014-10-26 14:17:32

标签: c++ netbeans makefile gnu

首先,为我的无知道歉。我确定我的问题的答案存在于此处的许多现有makefile线程之一中。但是,我一直无法找到一个简明扼要地回答我的具体问题的问题,而不会使用与我的特定情况无关的细节混淆答案。

我的代码目录有一个包含main的顶级源文件。其余的源文件根据系统中的逻辑分区组织在子目录中。代码在包含中不包含相对路径。这意味着如果使用以下简单的makefile将所有代码放在一个目录中,一切都可以正常工作:

CC=g++
CFLAGS=-c
LDFLAGS=
SOURCES=Main.cpp Source1.cpp Source2.cpp Source3.cpp Etc.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=executable

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

到目前为止,我一直在使用NetBeans IDE构建代码。这有助于通过代表我生成一些庞大而过于复杂的makefile来保护我的无知。现在是分发我的代码供公众使用的时候了,所以我希望生成一个makefile,这样我就能用我的目录结构来分发代码。

你能帮忙吗?

此致 Enthusastic Amateur。

2 个答案:

答案 0 :(得分:1)

看看这个:

# Source directories separated by space
# Example ./ src1/ src2/
SRCDIR   = ./ src/
# Directory where object files will be placed
OBJDIR   = obj/
# Include directories separated by space
# Example: include1/ include2/
INCDIR   = include/
# Directory where binary file will be placed
BINDIR   = bin/
# Name of the result file
TARGET   = app
# Compiler
CXX      = g++

# Retrive list of the source files
SRC      = $(wildcard $(addsuffix *.cpp,$(SRCDIR)))
# Generate list of the object files
OBJ      = $(addprefix $(OBJDIR), $(patsubst %.cpp, %.o, $(notdir $(SRC))))

VPATH    = $(SRCDIR)

# Compilation flags
CXXFLAGS = -std=c++11 -pthread

$(TARGET) : $(OBJ)
    @echo Linking...
    @mkdir -p $(BINDIR)
    @$(CXX) $(CXXFLAGS) -o $(BINDIR)$@ $(OBJ)

$(OBJDIR)%.o : %.cpp
    @echo Compiling $< in $@...
    @mkdir -p $(OBJDIR)
    @$(CXX) $(CXXFLAGS) $(addprefix -I,$(INCDIR)) -c -o $@ $<

clean :
    @$(RM) -r $(OBJDIR)
    @$(RM) -r $(BINDIR)

在这里,您可以提供多个源目录。

答案 1 :(得分:0)

并且&#34;一切都很完美&#34;如果代码在多个目录中,使用您已有的相同makefile。无需更改。