2014-02-17 5 views
0

Я пытаюсь создать файл makefile для моего проекта, но я действительно не понимаю эту черту.build makefile с различными папками в приложении

Когда я делал это на Java, с муравьем, это было намного проще.

Структура моей программы: http://imageshack.com/a/img39/6592/jsxa.png

Я читал о создании мейкфайлов, но, когда они отвечают на вопрос похожи, они просто положить сделаны Makefile и не объясняют много о том, что они делают.

Итак, мне нужно сделать make-файл, который находится в папке с именем foo (foo/makefile) вместе с папкой src (foo/src /). Файл makefile должен создать папку с именем bin (foo/bin /) и поместить туда * .o файлы. Затем создайте программу (DisqueRango.cpp contais main function) и запустите ее, используя 4 аргумента: «-e couriers.csv -c menu.csv».

Я не прошу сделать makefile. Мне нужно объяснение того, что мне нужно сделать самому.

Благодарю вас.

Makefile ЦСИ/клиентов/

CC := g++ 

OBJ = *.cpp 

all: prog 

prog: 
    $(CC) -c $(OBJ) 

Makefile из SRC/disquerango/(contais основная функция)

CC := g++ 

BASEDIR := .. 
MODULES := clients couriers products read requests 
OBJS := $(addsuffix /*.o, $(addprefix $(BASEDIR)/,$(MODULES))) 

.PHONY: clean 

all: 
    $(CC) -o disquer DisqueRango.cpp $(OBJS) 

и Makefile, которые называют их все (же папка ЦСИ):

CC := g++ 

BASEDIR := src 
PROJN := disquerango 
MODULES := clients couriers products read requests disquerango 
OBJS := $(addprefix $(BASEDIR)/,$(MODULES)) 

all: compila run limpa 

compila: 
     for dir in $(OBJS); do (cd $$dir; ${MAKE} all); done 

run: compila 
    ./$(BASEDIR)/$(PROJN)/disquer -e entregadores.csv -c cardapio.csv 

limpa: 
    rm -f $(BASEDIR)/$(PROJN)/disquer 
    for dir in $(OBJS); do (cd $$dir; rm -f *.o); done 
+0

Почему у вас есть каталоги внутри вашего проекта? Зачем? Вы собираетесь создать часть своего проекта в качестве библиотеки многократного использования? См. [this] (http://stackoverflow.com/a/20146082/841108) & [that] (http://stackoverflow.com/a/21423765/841108) отвечает ... –

+0

У меня есть каталоги, потому что учитель хочет этого , Это проект выпускного класса. – ddz

+1

Прочитайте [рекурсивный считать считающимся вредным] (http://miller.emu.id.au/pmiller/books/rmch/). –

ответ

1

Это может занять несколько итераций. Вы должны начать с малого и простого и работать до большого и сложного.

Сначала создайте bin/ самостоятельно.

Теперь написать Makefile, который может построить один объект файл:

bin/DisqueRango.o: src/DisqueRango.cpp 
    g++ -c src/DisqueRango.cpp -o bin/DisqueRango.o 

Получить эту работу, и понять, как он работает, оставить комментарий, чтобы сказать нам результат, и мы будем продолжать ,

РЕДАКТИРОВАТЬ:

SRC/клиенты/Makefile:

CC := g++ 

OBJ = *.cpp 

all: prog 

prog: 
    $(CC) -c $(OBJ) 

Этот Makefile является эффективным, но сырой. Он будет перестраивать все объекты при каждом запуске, даже если они уже обновлены. Мы могли бы добавить еще одну команду: mv *.o ../../bin, которая поместила бы их всех в bin/, но я думаю, что лучше улучшить базовую структуру сейчас, а код clients по-прежнему прост.

В заявлении OBJ = *.cpp приводится переменная OBJ значение *.cpp; подстановочный знак не будет расширяться до тех пор, пока переменная не будет использоваться в команде оболочки. Чтобы назначить список файлов переменной, мы используем функцию wildcard.Чтобы преобразовать список исходных файлов (foo.cpp) в список объектных файлов (foo.o), мы используем функцию patsubst. Для создания объектных файлов мы используем pattern rule, и в этом правиле мы используем automatic variables для ссылки на исходный файл (foo.cpp) и цель (foo.o).

CC := g++ 

SRC := $(wildcard *.cpp)    # foo.cpp bar.cpp baz.cpp 
OBJ := $(patsubst %.cpp,%.o,$(SRC)) # foo.o bar.o baz.o 

all: $(OBJ) 

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

Испытайте это, чтобы убедиться, что он работает. Теперь, чтобы это Makefile поместить объектные файлы в bin/, мы делаем небольшие изменения:

CC := g++ 
BIN := ../../bin 


SRC := $(wildcard *.cpp) 
OBJ := $(patsubst %.cpp,$(BIN)/%.o,$(SRC)) 

all: $(OBJ) 

$(BIN)/%.o: %.cpp 
    $(CC) -c $< -o [email protected] 

Убедитесь, что что много работает,, и мы будем двигаться дальше src/disquerango/makefile.

+0

Я сделал что-то, что может сгенерировать файлы .o и связать их все, используя make make-файлы, по одному в каждой папке. для каталога в $ (OBJS); do (cd $$ dir; $ {MAKE} все); сделано сделал это для меня но я coudn't cread bin папка и класть все .o внутри. Могу ли я обмануть, если я использую команды оболочки для этого? heh – ddz

+0

Несколько make-файлов * иногда * хорошее решение (я не подписываюсь на «Recursive Make считают вредным»). Если вы уверены, что хотите применить этот подход, отредактируйте свой вопрос, чтобы включить один из make-файлов (например, 'src/clients/makefile'), и мы изменим его, чтобы помещать объектные файлы в' bin/'. – Beta

+0

Хорошо! Я только что редактировал вопрос. – ddz

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