Подкаталоги Makefile - PullRequest
       33

Подкаталоги Makefile

1 голос
/ 07 ноября 2011

Я пытаюсь организовать каталог моего проекта следующим образом:

shell
| inc / [заголовочные файлы]
| obj / [объектные файлы]
| src / [исходные файлы]
| Makefile
| Исполняемый файл

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

Вот как выглядел мой make-файл без каталогов

OBJS = shutil.o parser.o sshell.o
HEADER_FILES = shell.h parser.h
EXECUTABLE = sshell
CFLAGS = -Wall
CC = gcc
#Create main executable
$(EXECUTABLE): $(OBJS)
    $(CC) -o $(EXECUTABLE) $(OBJS)
#Create object files
%.o: %.c
$(CC) $(CFLAGS) -I.  -c -o $@ $<
$(OBJS) : $(HEADER_FILES)

Я попытался добавить каталоги в определения (для каталогов obj / и inc /)

OBJS = obj/shutil.o obj/parser.o obj/sshell.o

И изменил каждый экземпляр% .o и% .c на obj /%. O и src /%. C

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

gcc -Wall -Iinc -c -o obj/shutil.o src/shutil.c
src/shutil.c:8:23: fatal error: inc/shell.h: No such file or directory
compilation terminated.

Может кто-нибудь найти, что я здесь делаю не так?Я боролся с этим в течение нескольких дней.

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Измените -I. на -I${CURDIR}. Первый добавляет каталог источника, скомпилированного в список включаемых путей, который будет shell/src. Последний добавляет shell, это, вероятно, то, что вы хотите.

Вы также можете взглянуть на Создание нескольких исполняемых файлов с похожими правилами для микрорекурсивного make-фреймворка.

0 голосов
/ 09 ноября 2011

Хорошо, это заняло некоторое тщательное разочарование, но я понял это сейчас.Я изменил свои определения в верхней части, чтобы включить пути к файлам, например:

OBJS = obj/shutil.o obj/parser.o obj/sshell.o
HEADER_FILES = inc/shell.h inc/parser.h

И, похоже, ключ был -I./inc, а не -Iinc, как я ожидал.

obj/%.o: src/%.c
    $(CC) $(CFLAGS) -I./inc -c -o $@ $<
0 голосов
/ 07 ноября 2011

Ваш компилятор ищет inc / shell.h, чего не должно быть.Как правило, в исходном файле не должно быть пути, зависящего от системы сборки, но детали системы сборки следует определять с помощью флагов компилятора.

То есть исходный файл src / shutil.c должен выглядеть следующим образом:

#include "shell.h"

и ваш вызов компилятора будет одинаковым, при этом -Ininc пропускает путь включения.

При отсутствии путей к исходным файлам реализация и установка файлов заголовков оченьпроще.

...