我正在尝试学习制作文件。
我的目录结构是
$ 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
放在source
,makefile
放入make
,编译all .o files
中的bin/obj
和exe
/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
目录
任何帮助都将不胜感激。
由于
答案 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
来查找目标文件。