2014-10-26 3 views
0

Во-первых, извинения за мое невежество. Я уверен, что ответ на мой вопрос существует в одном из многих существующих тем в файле makefile. Тем не менее, я не смог найти то, что кратко и четко отвечает на мой конкретный вопрос, не обманывая ответ деталями, которые не имеют отношения к моей конкретной ситуации.Один файл верхнего уровня с исходными подкаталогами

В моей кодовой директории имеется один файл исходного уровня верхнего уровня, содержащий основной. Остальные исходные файлы организованы в подкаталоги в соответствии с логическими делениями в системе. Код не содержит относительных путей в include. Это означает, что все работает отлично, если весь код находится в одном каталоге с помощью следующего, простого 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 [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

До сих пор я не строил свой код с помощью NetBeans IDE. Это помогло сохранить мое невежество, породив некоторые огромные и чрезмерно сложные make-файлы от моего имени. Теперь пришло время распространять мой код для публичного использования, поэтому я ищу для создания make-файла, который позволит мне распространять код со структурой каталога, которую у меня есть.

Вы можете помочь?

С уважением, Enthusastic Amateur.

ответ

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)[email protected] $(OBJ) 

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

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

Здесь вы можете предоставить несколько каталогов источника.

+0

Эй, НиколайКондратьев, извините за задержку в ответе на это! Меня отвлекла другая работа и только что провела тестирование вашего Makefile. Ваш вклад именно то, что я искал! Большое спасибо! :-) – phlndrwd

0

И «все работает отлично», если код находится в нескольких каталогах, используя тот же самый файл makefile, который у вас уже есть. Никаких изменений не требуется.

+0

Моя проблема с старым Makefile не имела относительного пути к файлам заголовков, записанным в исходных файлах. – phlndrwd

Смежные вопросы