2013-08-25 3 views
0

У меня есть такая структура папок.Makefile не находит файл include

Gif_Utility

-> Makefile

-> включают в себя (все .h файлы здесь)

-> Src (все .c файлы здесь).

Я пишу makefile.

Makefile 

VPATH = src:include 
INC = -I ./include 

gif_objects = gif_display.o \ 
      gif_lzw.o \ 
      gif_read.o \ 
      sysm.o \ 
      x86_main.o 


gif_display.0 : gif_display.c 
    gcc -I /export/home/joshis1/MakeTutorial/GIF_Utility/include -c $< 

#gif_lzw.0 : gif_lzw.c 
# gcc $(INC) -c src/gif_lzw.c 

#gif_read.0 : gif_read.c 
# gcc -I ./include/ -c $< 

#sysm_main.0 : sysm_main.c 
# gcc -I ./include/ -c $< 

#x86_main.0 : x86_main.c 
# gcc -I ./include/ -c $< 


On command prompt: 
$ make gif_display.o 

cc -c -o gif_display.o src/gif_display.c 
src/gif_display.c:2:17: fatal error: sysm.h: No such file or directory 
compilation terminated. 
make: *** [gif_display.o] Error 1 

С другой стороны, если я делаю так он компилирует штраф $ делает -> это создает gif_display.o

Я не знаю, почему он бросает ошибку определения правила , Я что-то пропустил, пожалуйста, помогите.

Я использую машину Ubuntu для создания моего кода.

ответ

2

В вашем файле makefile есть .0 (ноль) суффикс вместо правильного .o (буква oh).

Когда вы запускаете только make, он пытается создать первую цель в Makefile, и поэтому запускает рецепт, содержащий правильный путь включения -I. Тот факт, что он создает файл .o, а не файл .0, является приемлемым для make, хотя, я полагаю, он мог хотя бы напечатать предупреждение в этом сценарии.

Когда вы запустите make gif_display.o, он использует встроенные в Make файлы для файлов .o, которые не содержат ваш путь include.

Учитывая, что make уже имеет встроенные правила для файлов .o, ваши правила в основном являются излишними. Было бы лучше просто добавить параметр -I include к правилам по умолчанию, с чем-то вроде

CFLAGS += -I include 

Таким образом, весь Makefile может быть столь же простым, как это:

VPATH = src:include 
CFLAGS += -I ./include 

gif_objects = gif_display.o \ 
      gif_lzw.o \ 
      gif_read.o \ 
      sysm.o \ 
      x86_main.o 

Я не вижу ничего предупредите свой файл Makefile об изменениях в файлах .h, поэтому вам может понадобиться добавить для этого отдельную зависимость. Если у вас есть только несколько общих файлов заголовков между всеми файлами объект, может быть, это будет все, что вам нужно:

$(gif_objects): $(wildcard include/*.h) 

В основном это делает include компонента VPATH излишни.

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