2016-11-15 9 views
6

Я искал это часами, но почему-то я до сих пор не нашел что-то, что работает для меня.Makefile: автоматически компилировать все файлы c, сохраняя файлы .o в отдельной папке

У меня есть каталог с 3 подкаталогами. src/для .c и .h файлов, bin /, где предполагается скомпилированный исполняемый файл, и obj /, где я хочу, чтобы файлы .obj шли.

Теперь я хочу, чтобы makefile скомпилировал каждый файл .c из src (без необходимости перечислять их все в make-файле) и поместить файлы .o в obj, а исполняемый файл, созданный из foo.c, сохранен как bin/foo ,

Может кто-нибудь помочь мне? Всякий раз, когда я использую подстановочные знаки, жалуюсь на то, что правил не существует, и когда я использую неявные правила, он не помещает объектные файлы в отдельную папку.

ответ

9

Чтобы построить foo.o из foo.c, локально:

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

Чтобы сделать то же самое, но с любыми необходимыми файлами заголовков в src/:

SRC := src 

foo.o: foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Чтобы сделать то же самое, но с исходным файлом в src/:

SRC := src 

foo.o: $(SRC)/foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Чтобы сделать это, но поместить объектный файл в obj/:

SRC := src 
OBJ := obj 

$(OBJ)/foo.o: $(SRC)/foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Правило шаблон, который будет делать, что для любого такого объекта файла (obj/foo.o, obj/bar.o, ...):

SRC := src 
OBJ := obj 

$(OBJ)/%.o: $(SRC)/%.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Для создать список желаемых объектов:

SOURCES := $(wildcard $(SRC)/*.c) 
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) 

и правило, чтобы охватить их все:

all: $(OBJECTS) 

Собирает все вместе:

SRC := src 
OBJ := obj 

SOURCES := $(wildcard $(SRC)/*.c) 
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) 

all: $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJ)/%.o: $(SRC)/%.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Обратите внимание, что это имеет один большой недостаток: это не отслеживают зависимости от заголовочных файлов. Это можно сделать автоматически, но это тонкий трюк; это может подождать, пока вы не овладели этим.

+0

Благодарим вас за фантастический ответ. Последний фрагмент фактически не будет создавать исполняемый файл, но добавление не было проблемой, и все файлы там, где я хочу, чтобы они были :) – Max

+0

Это последнее правило шаблонов, вероятно, будет выглядеть лучше, как правило статического шаблона. – bobbogo

+0

@bobbogo: Согласен, но я старался для простоты. – Beta

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

  • Нет связанных вопросов^_^