make-файл в нестандартной структуре каталогов - PullRequest
2 голосов
/ 14 августа 2011

Очень похожий вопрос, но не точный к часто задаваемым; Мой проект имеет следующий макет (кроссплатформенный, следовательно, разные IDE и т. д.)

[Project]
   |
   |--- codeblocks
   |       |- obj
   |--- src
   |--- visual_studio

По сути, я пытаюсь получить свой make-файл (расположенный в каталоге codeblocks), скомпилировать файлы, содержащиеся в src, и поместить объектные файлы в каталог obj.

Сторона компиляции, которую я могу получить без проблем, но я не могу понять, как заставить make использовать этот альтернативный каталог в качестве default местоположения для объекта файлы ; перемещая их потом, я могу это сделать, но это означает, что мне приходится перекомпилировать все приложение каждый раз, когда я делаю сборку, которая побеждает объект make-файла.

Прочитав документацию по make (да, я попробовал сначала и узнал несколько дополнительных вещей по пути!), Я натолкнулся на несколько примеров, таких как $(OBJDIR)/%.o: %.c, но make не может найти правило, чтобы использовать его, и я далеко не достаточно опытен, чтобы выработать его для себя: (

Может кто-нибудь указать мне правильное направление или дать несколько подходящих советов?

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Вот простой пример Makefile, демонстрирующий, как это сделать.

SOURCES = $(wildcard src/*.c)
OBJECTS = $(SOURCES:src/%.c=obj/%.o)

obj/%.o: src/%.c
        $(CC) $(CFLAGS) -c -o $@ $<

target.exe: $(OBJECTS)
        $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)

Структура каталога и файлы, необходимые для Makefile:

project/
project/Makefile
project/src/*.c
project/obj

Я протестировал это на своей машинеи он работал правильно:

$ make
cc  -c -o obj/main.o src/main.c
cc -o target.exe obj/main.o  
0 голосов
/ 14 августа 2011

Если вы используете GNU make, вы можете использовать расширенные правила шаблонов, как вы описали.Тогда вы можете иметь правило

$(OBJDIR)/%.o: $(SRCDIR)/%.c
        $(CC) $(CFLAGS) -c -o $@ $^

Для компиляции исходных файлов.Дополнительным осложнением является то, что для связывания правила необходимо также указать $ (OBJDIR) для всех объектных файлов.Вы можете использовать что-то вроде

SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

$(TARGET): $(OBJECTS)
        $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)

В качестве альтернативы, вы можете использовать VPATH, чтобы избежать необходимости $ (SRCDIR) во всех этих местах.

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