LINUX.ORG.RU

Проблема с make

 ,


0

2

При попытке собрать проект (учебный) с помощью make вылазит вот такое: make: *** No rule to make target `dc.h', needed by `array.o'. Stop. Содержимое файла Makefile:

LANG = cc

CC = g$(LANG)

FLAGS = -ansi -Os

DEB_FLG= 

O_FILES = array.o stack.o dc.o misc.o numeric.o eval.o string.o

dc:  $(O_FILES)

	$(CC) $(DEB_FLG) $(FLAGS) -o dc $(O_FILES) -L. -lbc

clean:

	rm -f $(O_FILES)

dcdeb: 

	make clean

	make DEB_FLG=-g	

dcplus:

	make clean

	make LANG=++

array.o: array.c dc.h dc-regdef.h

	$(CC) $(DEB_FLG) $(FLAGS) -c array.c dc.h dc-regdef.h -L. -lbc

dc.o: dc.c dc.h dc-regdef.h getopt.h

	$(CC) $(DEB_FLG) $(FLAGS) -c dc.c dc.h dc-regdef.h getopt.h -L. -lbc

misc.o: misc.c dc.h 

	$(CC) $(DEB_FLG) $(FLAGS) -c misc.c dc.h -L. -lbc

eval.o: eval.c dc.h

	$(CC) $(DEB_FLG) $(FLAGS) -c eval.c dc.h -L. -lbc

numeric.o: numeric.c dc.h number.h

	$(CC) $(DEB_FLG) $(FLAGS) -c numeric.c dc.h number.h -L. -lbc

stack.o: stack.c dc.h dc-proto.h dc-regdef.h

	$(CC) $(DEB_FLG) $(FLAGS) -c stack.c dc.h dc-regdef.h -L. -lbc

string.o: string.c dc.h

	$(CC) $(DEB_FLG) $(FLAGS) -c string.c dc.h -L. -lbc

misc.a: misc.c eval.c

	$(CC) $(FLAGS) -c -fPIC misc.c

	$(CC) $(FLAGS) -c -fPIC eval.c

	ar rc misc.a misc.o eval.o

В чем может заключаться ошибка?

Наивное предположение, но сам на такие грабли наступал. Точно есть dc.h, а не dс.h с русской «с»? И да, нафига заголовочники вообще компилировать? Обычно достаточно «cc array.c», а dc.h можно оставить только в пререквизитах.

anonymous
()
Ответ на: комментарий от kyka276

Как предположил аноним, значит что-то не так с написанием, кодировка или может быть регистр не тот. В снипете я не вижу русской «c», может в файловой системе.

xaizek ★★★★★
()

Проверь что ипользуешь табуляцию а не пробелы для рецептов в мэйкфайле. Почитай про опцию -I в документации компилятора.

anonymous
()
Ответ на: комментарий от anonymous

Как анонимус анонимусу скажу: говоришь все правильно, но мимо. Про табы/пробелы make (по крайней мере, версия GNU) говорит совершенно четко; кроме того, отступаются только рецепты; сообщение же про то, что нет правила вообще. Ну а проблемы с инклюдами (я про -I) - это проблемы компилятора, а не make.

anonymous
()
Ответ на: комментарий от sigurd
-rwxrwxrwx 1 igor igor 2270 Sep 21  2010 dc.h

Ошибка всё равно та же...

kyka276
() автор топика
Ответ на: комментарий от anonymous

Использую табы, естественно. С компилятором всё в порядке.

kyka276
() автор топика

Ладно, буду пытаться что то делать с этим. В любом случае, проблему решить надо, от этого никуда не деться.

kyka276
() автор топика
Ответ на: комментарий от kyka276

Само по себе не должно (дефисы могут портиться, но тут вроде нормально с этим), если там что-то нормально было.

А make вообще запускается в том же каталоге, где dc.h лежит?

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

не, запускаю из корневого каталога проэкта

igor@ubuntu:~/src2$ tree
.
├── array.c
├── dc.1
├── dc.c
├── eval.c
├── include
│   ├── dc.h
│   ├── dc-proto.h
│   ├── dc-regdef.h
│   ├── getopt.h
│   └── number.h
├── lib
│   └── libbc.a
├── misc.c
├── numeric.c
├── README
├── stack.c
└── string.c

2 directories, 15 files

З.Ы. на данный момент мэйк файл удалил

kyka276
() автор топика
Ответ на: комментарий от kyka276

Вот и разгадка. Тогда и в Makefile надо писать include/dc.h и так далее (есть другие варианты, VPATH должен помочь, но проще пути подправить на правильные). make не будет искать файлы в подкаталогах, он берёт путь как есть и использует.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

O_FILES = array.o stack.o dc.o misc.o numeric.o eval.o string.o

именно тут еще надо указать относительный путь к dc.h и прочим файлм из подкаталогов?

kyka276
() автор топика
Ответ на: комментарий от xaizek

мэйкфайлы осваиваю, но пока что не всё толком понимаю...

kyka276
() автор топика
Ответ на: комментарий от kyka276

Во всём файле сделать замены вроде

dc.o: dc.c dc.h dc-regdef.h getopt.h
на
dc.o: dc.c include/dc.h include/dc-regdef.h include/getopt.h
Чтобы все относительные пути стали правильными.

Там где вызывается компилятор, dc.h и подобные можно убрать, т.е. не

$(CC) $(DEB_FLG) $(FLAGS) -c string.c dc.h -L. -lbc
а
$(CC) $(DEB_FLG) $(FLAGS) -c string.c -L. -lbc
Кстати, тогда и -Llib надо, раз библиотека не в корне.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

И еще раз спасибо, теперь уж точно всё понятно. Вы смогли объяснить буквально за пару минут то, что преподы в универе за 1.20ч объяснить не в состоянии...

kyka276
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.