1

我有这样的文件夹结构。

Gif_Utility

-> 生成文件

-> 包含(所有 .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

另一方面,如果我喜欢这样做,它可以很好地编译 $make -> 这会创建 gif_display.o

我不知道为什么在指定规则时会引发错误。我错过了什么,请帮忙。

我正在使用 Ubuntu 机器来构建我的代码。

4

1 回答 1

2

您的 makefile 有一个.0(零)后缀,而不是正确的.o(字母 oh)。

当您运行时,make它会尝试在 Makefile 中构建第一个目标,因此运行包含正确-I包含路径的配方。.o它产生一个文件而不是文件的事实.0是可以接受的make,尽管我认为它至少可以在这种情况下打印一个警告。

当您运行make gif_display.o它时,它使用 Make 的内置.o文件生成,其中不包含您的包含路径。

鉴于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多余。

于 2013-08-25T10:58:38.887 回答