包括.h文件并将.o文件定向到目录:Make

时间:2014-04-20 02:40:54

标签: c makefile

我正在尝试学习制作文件。

我的目录结构是

$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
   .
   |-bin
   |---exe
   |---obj
   |-build
   |-include
   |-lib
   |-make
   |-source

我要做的是将我的包含文件conversion.h放在include文件夹中,all .c files放在sourcemakefile放入make ,编译all .o files中的bin/objexe

中的/bin/exe

我在下面提到了帖子:

makefile include *.h file in other directory

Using make to move .o files to a separate directory

我的makefile是:

VPATH= ./../source
OBJDIR= ./../bin/obj
EXEDIR= ./../bin/exe
#vpath %.o $(OBJDIR)
CFLAGS= -Wall -c -I.
#INCLUDES= -I./../include

objects= binary.o hex.o octal.o

conversion: $(objects)
#       gcc -Wall -o conversion $(objects) -I.

binary.o: binary.c conversion.h
        gcc $(CFLAGS) $< -o $(OBJDIR)/$@

octal.o: octal.c conversion.h
        gcc $(CFLAGS) $< -o $(OBJDIR)/$@

hex.o: hex.c conversion.h
        gcc  $(CFLAGS) $< -o $(OBJDIR)/$@


clean:
        rm -rf $(OBJDIR)/*.o *.o *~ conversion

我正在使用cygwin。 我的问题是:

1)我无法在conversion.h位置添加./../include 如果我将-I.复制到conversion.h文件夹,make工作正常 - 但只要我在-I./../include文件夹中没有conversion.h的任何副本,就用make替换 我得到以下错误

$ make
make: *** No rule to make target 'conversion.h', needed by 'binary.o'.  Stop.

2)我的makefile会将所有.o个文件放到/bin/obj但是当我尝试使用vpath时,如下所示(而不是像[{1}}那样使用手动展示位置)

-o $(OBJDIR)/$@

对所有.o规则进行上述替换,不会将vpath %.o $(OBJDIR) ... $(OBJDIR)/binary.o: binary.c conversion.h gcc $(CFLAGS) $< -o $@ ... ... 放置到all .o files目录

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

在定义目标及其依赖项时,必须明确说明.h文件,.c文件,.o文件和可执行文件的位置。

VPATH= ./../source
INCLUDEDIR= ./../include
OBJDIR= ./../bin/obj
EXEDIR= ./../bin/exe
#vpath %.o $(OBJDIR)
INCLUDES= -I./../include
CFLAGS= -Wall -c -I. $(INCLUDES)

objects= $(OBJDIR)/binary.o $(OBJDIR)/hex.o $(OBJDIR)/octal.o

$(EXEDIR)/conversion: $(objects)
#       gcc -Wall -o conversion $(objects) -I.

$(OBJDIR)/binary.o: $(VPATH)/binary.c $(INCLUDEDIR)/conversion.h
    gcc $(CFLAGS) $< -o $@

$(OBJDIR)/octal.o: $(VPATH)/octal.c $(INCLUDEDIR)/conversion.h
    gcc $(CFLAGS) $< -o $@

$(OBJDIR)/hex.o: $(VPATH)/hex.c $(INCLUDEDIR)/conversion.h
    gcc  $(CFLAGS) $< -o $@

clean:
    rm -rf $(OBJDIR)/*.o *.o *~ $(EXEDIR)/conversion

答案 1 :(得分:0)

由于您的头文件位于单独的目录中,make无法找到它们。由于它无法找到它们,因此它会尝试通过查找目标规则来构建它们。由于无法找到目标,因此您会收到问题中列出的错误。

-I./../includes仅影响编译器的搜索路径。它不会影响make查找包含的方式。

如果您希望make搜索您的标头文件,则需要为标头添加vpath。您可能会对源文件获得相同的错误,因为它们也位于单独的目录中。因此,您还需要为源文件添加vpath

要使原始版本与vpath一起使用而不是显式位置,请尝试以下操作:

VPATH= ./../source
OBJDIR= ./../bin/obj
EXEDIR= ./../bin/exe
INCLUDES= -I./../include
vpath %.c $(VPATH)
vpath %.h $(INCLUDES)
vpath %.o $(OBJDIR)
CFLAGS= -Wall -c -I. $(INCLUDES)

正如我的评论和引用问题的评论中所述,建议不要使用vpath来查找目标文件。