У меня возникли проблемы с попыткой использовать make для размещения объектных файлов в отдельном подкаталоге, вероятно, очень простой метод. Я пытался использовать информацию на этой странице: http://www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-Types
Я получаю следующий вывод от make:
make: *** No rule to make target 'ku.h', needed by 'obj/kumain.o'. Stop.
Однако ku.h является зависимостью, а не целью (хотя она, очевидно, включена в исходные файлы c). Когда я не пытаюсь использовать подкаталог для объектных файлов (то есть пропускаю части OBJDIR), он работает нормально. Почему заставляет думать, что ku.h является целью?
мой make файл такой: (стиль после чтения различных источников информации)
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
VPATH=%.c src
VPATH=%.h src
VPATH=%.o obj
OBJDIR=obj
objects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o )
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
.PHONY: clean
clean :
rm $(objects)
Изменение: я применил изменения, чтобы использовать директиву vpath. Моя версия была плохой смесью VPATH = xxx и vpath%.c xxx. Однако теперь я получаю другую проблему (которая была первоначальной проблемой до того, как я добавил неправильный vpath). Теперь это вывод:
gcc -o ku -lhpdf obj/kumain.o obj/kudlx.o obj/kusolvesk.o ..etc
gcc: obj/kumain.o: No such file or directory
gcc: obj/kudlx.o: No such file or directory
gcc: obj/kusolvesk.o: No such file or directory
gcc: obj/kugetpuz.o: No such file or directory
gcc: obj/kuutils.o: No such file or directory
gcc: obj/kurand.o: No such file or directory
gcc: obj/kuASCboard.o: No such file or directory
gcc: obj/kuPDFs.o: No such file or directory
gcc: obj/kupuzstrings.o: No such file or directory
gcc: obj/kugensud.o: No such file or directory
gcc: obj/kushapes.o: No such file or directory
make: *** [ku] Error 1
Похоже, что make не применяет неявное правило для объектного файла, хотя в руководстве говорится: "Неявные правила говорят make, как использовать обычные методы, чтобы вам не приходилось указывать их подробно, когда вы хотите их использовать. Например, есть является неявным правилом для компиляции C. Имена файлов определяют, какие неявные правила запускаются. Например, компиляция C обычно берет файл.c и создает файл.o. Так что make применяет неявное правило для компиляции C, когда видит эту комбинацию окончания имени файла. " а также "Поиск по каталогам, указанным в VPATH или с помощью vpath, также происходит при рассмотрении неявных правил (см. Использование неявных правил)".
Опять здесь "Например, когда файл foo.o не имеет явного правила, make рассматривает неявные правила, такие как встроенное правило для компиляции foo.c, если этот файл существует. Если такого файла нет в текущем каталоге, соответствующие каталоги ищутся. Если foo.c существует (или упоминается в make файле) в каком-либо из каталогов, применяется неявное правило для компиляции Си ".
Будем весьма благодарны за любую помощь в получении неявных правил для моего make файла.
Редактирование № 2: Благодаря Джеку Келли я сделал явное правило для компиляции файлов.c, так как не мог нигде пытаться использовать неявные правила. Также спасибо al_miro за информацию о vpath.
Вот рабочий макфайл:
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
OBJDIR=obj
vpath %.c src
vpath %.h src
objects = $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o )
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(OBJDIR) obj/%.o : %.c ku.h kudefines.h kuglobals.h kufns.h
$(CC) -c $(CPPFLAGS) $< -o [email protected]
.PHONY : clean
clean :
rm $(objects)