C Makefile在子文件夹中找不到文件

C Makefile在子文件夹中找不到文件,c,gcc,makefile,gnu-make,C,Gcc,Makefile,Gnu Make,我正在尝试用C语言为我的项目编写Makefile。 我的.c文件在src子文件夹中, 生成子文件夹中的.o文件, src/header子文件夹中的.h文件 和.c文件,用于测试子文件夹中的测试 在我的Makefile中,我使用的是vpath: vpath %.c src:tests vpath %.h src/header vpath %.o build 当我想要编译file1时,Makefile在子文件夹中查找file1.c并将对象文件编译到子文件夹中作为build/file1.o并没

我正在尝试用C语言为我的项目编写Makefile。 我的.c文件在src子文件夹中, 生成子文件夹中的.o文件, src/header子文件夹中的.h文件 和.c文件,用于测试子文件夹中的测试

在我的Makefile中,我使用的是vpath:

 vpath %.c src:tests
 vpath %.h src/header
 vpath %.o build
当我想要编译file1时,Makefile在子文件夹中查找file1.c并将对象文件编译到子文件夹中作为build/file1.o并没有问题。但当它将file1编译成可执行文件时,Makefile找不到file1.o

这是我在Makefile中为特定文件编写的代码:

test_file1: test_file1.o file.o
    $(CC) $^ -o tests/$@

test_file1.o: test_file1.c file1.h  
    $(CC) $(CFLAGS) -c $< -o build/$@

file1.o: file1.c file1.h file2.h file3.h
    $(CC) $(CFLAGS) -c $< -o build/$@
从test_file1.o我得到: gcc-std=c99-Wall-Wextra-pedantic-g-c测试/测试文件1.c-o 毫无问题地构建/测试\u file1.o

从文件1.o我得到: gcc-std=c99-Wall-Wextra-pedantic-g-csrc/file1.c-o build/file1.o也没有问题

但从test_file1中,我得到的文件没有子文件夹的路径: gcc test_file1.o file1.o-o tests/test_file1

并获取以下错误: gcc:error:test_file1.o:没有这样的文件或目录 gcc:error:file1.o:没有这样的文件或目录 gcc:致命错误:没有输入文件

这两个文件都在子文件夹生成中。
哪里有问题?

问题在于,您的一些规则实际上并没有构建它们声称要构建的内容,违反了规则

Make确保它必须构建file1.o。该文件在开始时不存在,vpath无法找到尚不存在的文件。因此,Make查找规则并找到以下内容:

file1.o: file1.c file1.h file2.h file3.h
    $(CC) $(CFLAGS) -c $< -o build/$@
同样地:

build/test_file1.o: test_file1.c file1.h  
    $(CC) $(CFLAGS) -c $< -o $@

问题是,您的一些规则实际上并没有构建它们声称要构建的内容,违反了

Make确保它必须构建file1.o。该文件在开始时不存在,vpath无法找到尚不存在的文件。因此,Make查找规则并找到以下内容:

file1.o: file1.c file1.h file2.h file3.h
    $(CC) $(CFLAGS) -c $< -o build/$@
同样地:

build/test_file1.o: test_file1.c file1.h  
    $(CC) $(CFLAGS) -c $< -o $@

欢迎来到堆栈溢出。看起来你发布的代码中有几个拼写错误。请尽量避免这种情况;对于我们来说,这样的错误更容易捕获。欢迎使用堆栈溢出。看起来你发布的代码中有几个拼写错误。请尽量避免这种情况;这样的错误对你来说更容易理解,谢谢你给我解释。我想让它干净,没有路径,但我认为这是不可能的。还感谢您提供的精彩链接。@mato0:makefiles的一个指导原则是Make擅长使用那里的文件在这里构建文件,但不是相反。谢谢您的解释。我想让它干净,没有路径,但我认为这是不可能的。同样感谢您提供的精彩链接。@mato0:我对makefile的一个指导原则是Make擅长使用那里的文件在这里构建文件,但不是相反。