2017-02-09 2 views
0

У меня есть следующая структура каталогов для фиктивного проекта C.Ошибка создания каталогов Generic Makefile

. 
├── inc 
│   ├── getmsg.c 
│   └── getmsg.h 
├── makefile 
└── src 
    └── main.c 

Мой текущий общий Makefile ниже,

TARGET = main 

# finds all .c files, inc/getmsg.c src/main.c 
SOURCES := $(shell find * -name *.c) 
# converts all .c files to .o files, inc/getmsg.o src/main.o 
OBJECTS := $(SOURCES:.c=.o) 
# directories that contain .h files for gcc -I flag, inc/ 
HEADERS := $(dir $(shell find * -name *.h)) 

CC  = gcc 
CFLAGS = -Wall -std=c99 -iquote "$(HEADERS)" 

all: $(TARGET) 

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

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

clean: 
    rm -rf $(shell find * -name *.o) $(TARGET) 

Это все отлично компилируется, однако он просто сбрасывает .o файлы в том же каталоге, что и соответствующий ему .c файл.

Что бы я хотел сделать, это добавить все объектные файлы в каталог сборки. Для этого я меняю OBJECTS на OBJECTS := $(patsubst %,build/%,$(notdir $(SOURCES:.c=.o))), в котором перечислены файлы build/getmsg.o build/main.o. Затем я установил цель %.o в build/%.o: %.c.

Это, однако, возвращает No rule to make target 'build/getmsg.o'. Таким образом, файл make не может создать файлы .o. Что мне здесь не хватает?

+0

Дубликаты http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory -than-src –

+0

Возможный дубликат [GNU Make pattern для создания вывода в другом каталоге, чем src] (http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different- directory-than-src) –

ответ

0

Try изменения

%.o: %.c 

в

build/%.o: %.c 
+0

То, что я устал, и это дало мне ошибку «Нет правила». – FlamingSquirrel

+0

Упс, пропустил эту часть! Проверьте следующую ссылку. http://stackoverflow.com/questions/14639794/getting-make-to-create-object-files-in-a-specific-directory – MrJagaloon

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