Канонический сборочный файл "простой проект" - PullRequest
2 голосов
/ 28 июня 2011

Ваш маленький проект на C / C ++ достиг точки, когда уже не практично хранить весь код в одном файле. Вы хотите выделить несколько компонентов. Итак, вы создаете каталог src/, а затем ... вам нужно написать настоящий Makefile. Нечто большее, чем hello: hello.o. Э-э-э ... это было $@ или $< или $^? Дерьмо. Вы не помните (я никогда не помню).

Есть ли у вас простой Makefile «один размер подходит всем», который может работать с простыми исходными деревьями? Если так, что в этом и почему? Я ищу самый маленький, самый простой Makefile, который может скомпилировать каталог, полный файлов C, без необходимости редактировать Makefile каждый раз, когда я добавляю файл. Вот что у меня есть:

CXX = clang++
CXXFLAGS = ...
LDFLAGS = ...
EXENAME = main

SRCS = $(wildcard src/*.cc)
OBJS = $(patsubst src%.cc,build%.o, $(SRCS))

all: $(EXENAME)

build/%.o: src/%.cc
    @mkdir -p $(dir $@)
    $(CXX) -c -o $@ $^ $(CXXFLAGS)

$(EXENAME): $(OBJS)
    $(CXX) -o $@ $^ $(LDFLAGS) 

clean:
    rm -rf $(EXENAME) build/

Этот Makefile собирает все файлы .cc в каталоге src/ в файлы .o в каталоге build/, а затем связывает их в родительский каталог.

Что бы вы сделали по-другому?

Ответы [ 3 ]

1 голос
/ 28 июня 2011

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

В правиле %.o я бы использовал $< вместо $^, чтобы позже вы могли добавить зависимости типа

build/foo.o: bar.h

И когда вы будете готовы, вы можете взглянуть на Advanced Auto-Dependency Generation .

0 голосов
/ 28 июня 2011

Используйте инструменты automake.Его легко вносить изменения и меньше нагрузки для разработчика.Это так же просто, как указать SOURCES, LDLIBS, LDFLAGS в качестве переменных.Сначала это может показаться немного странным.Но он становится вашим любимым, когда вы делаете больше на нем.

0 голосов
/ 28 июня 2011

Я никогда не использовал CMake, поэтому я ничего не могу сказать по этому поводу. Лучшее, что я могу предложить, - это программа, которая у нас есть в школе под названием «makemake», которая автоматически делает Makefiles - http://www.cs.rit.edu/~swm/makemake/ Это не очень продвинутая программа, но она выполняет свою работу. С другой стороны, его невероятно легко использовать - просто выполните makemake> Makefile в каталоге, и у вас есть Makefile, который соберет и свяжет все исходные файлы в этом каталоге (C и C ++). С другой стороны, если вы когда-нибудь добавите больше файлов, вы просто снова запустите makemake и получите новый make-файл. С другой стороны, нет никакого способа сохранить любые пользовательские цели от одного сгенерированного make-файла до следующего.

Что касается make-файлов «один размер подходит всем», хотя вы определенно можете это сделать, в первую очередь это отнимает от цели команду «make» - отслеживание времени последнего изменения файлов, и таким образом, перекомпилируйте только те файлы, которые были недавно изменены или зависят от только что измененных заголовочных файлов (хотя для генерации правильного вы можете использовать 'makedepend' - http://www.x.org/archive/X11R7.5/doc/man/man1/makedepend.1.html). Вы можете использовать то, что у вас есть, плюс makedepend для создания самообновляющегося make-файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...