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

我的目录结构是

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

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

我提到了以下帖子:

makefile在其他目录中包含* .h文件

使用make将.o文件移动到单独的目录

我的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)我无法从位置./../include包含我的conversion.h -I. 如果我复制工作正常conversion.hmake文件夹-但只要我更换-I./../include没有任何副本conversion.hmake文件夹中,我得到以下错误

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

2)我的makefile确实将所有.o文件放置到/bin/obj但是当我尝试使用如下所示的vpath (而不是使用像-o $(OBJDIR)/$@这样的手动放置)

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

在上面替换所有.o规则时,不会将all .o files放置到bin/obj目录中

任何帮助,将不胜感激。

谢谢

===============>>#1 票数: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

===============>>#2 票数:0

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

-I./../includes仅影响编译器的include搜索路径。 它不影响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查找目标文件。

  ask by Gaurav K translate from so

未解决问题?本站智能推荐:

1回复

makefile不会分别用.h文件更新.o文件

我有以下make文件: 并在我的src目录中添加文件:- objs是目录。 每当我更改ustreqsol.h文件时,它都会编译ustreqsol.c文件,但不会更改ui.h文件 作为makefile中的菜鸟,我不知道为什么会这样
1回复

使:* .h没有这样的文件或目录

我的项目具有以下目录结构: main.cu FA_kernels / *。cu FD_kernels / *。cu MEM_kernels / *。cu MOD_kernels / *。cu 标头/*.h * .extension表示一堆
2回复

包括gsl_type.h。文件未找到

这似乎是一个常见的问题,但我无法解决这个问题。 我有一些.c代码,我使用makefile编译。 目标是创建一个共享对象(.so),以便我可以从R运行C代码。 这是我的makefile: 它在我的实验室中的计算机上工作正常,但它在我的个人计算机上不起作用。 导致此问题的原因
1回复

make:从.o文件依赖.h文件的规则中排除main.c

我有一个包含大量源文件及其标题的C项目: 我也有一个main.c,但它没有.h文件: 我在Makefile中有这个: 这适用于one.o和two.o. 但是对于main.o来说没有任何好处,它没有依赖的main.h。 然后Make会抛出此错误。 我怎样才能最好
2回复

Makefile将.o文件移动到不同的目录

我在一个目录中有源代码,并在不同的目录中有一个makefile。 我能够使用make系统的vpath机制编译代码。 .o文件是在makefile所在的同一文件夹中创建的。 但我想将这些.o文件移动到另一个名为obj目录中。 我尝试了以下方法: 但是,它们仍然在与makefile相
1回复

Makefile:如何将所有.o文件放在目录中

我想将所有.o文件放在不同的目录中。 他可以创建所有.o文件,但可以创建.exe文件 我的Makefile: 在shell(Ubuntu)中有结果: PS:ac:打印A,bc:打印B等main.c使用ac和bc
1回复

MakeFile:错误: : 没有相应的文件和目录

我正在尝试从c调用java,并且已经创建了以下MakeFile: 当我用make编译时,出现如下错误: 我浏览了许多有类似问题的stackoverflow页面,但是它们都有与我已经实现的相同的解决方案。 他们说您需要将库路径链接到jni.h。 如您在我的MakeFile中
2回复

致命错误:addFunc.h:没有这样的文件或目录

我已经创建了一个Makefile在shell script.in中运行C程序,但是出现fatal error: addFunc.h: No such file or directory在mainProg.c页面和addFunc.c page中fatal error: addFunc.h: No
2回复

makefile在其他目录中包含* .h文件

由于* .o,*。h文件和* .c文件存储在不同的目录中,因此每次写* .o或* .h文件时是否都需要添加前缀$(ODIR)或$(IDIR)? 有一个优美的方法吗? 也许像$(IDIR)/ {ah,bh,ch}这样的方式? 这是makefile的示例:
1回复

严重错误:libavcodec / avcodec.h没有此类文件或目录

我在ubuntu1604平台上尝试调试ffmpeg,但是它总是说找不到头文件,但实际上我确实在编译代码中包括了头文件。 这是错误消息: 错误消息 这是我的测试代码: 这是我的Makefile 以下是我的目录信息: mk-screen-caps(父目录)