У меня проблемы с попыткой использовать 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 не имеет явногоrule, 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 $@
.PHONY : clean
clean :
rm $(objects)