【问题标题】:Makefile can not find files in subfoldersMakefile 在子文件夹中找不到文件
【发布时间】:2018-11-27 23:23:31
【问题描述】:

我正在尝试用 C 为我的项目编写 Makefile。
我的.c 文件在src 子文件夹中,
.o 文件在build 子文件夹中,
.h 文件在src/header 子文件夹中
.c 文件在tests 子文件夹中进行测试。

在我的 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 tests/test_file1.c -o build/test_file1.o 没有问题。

file1.o 我得到:
gcc -std=c99 -Wall -Wextra -pedantic -g -c src/file1.c -o build/file1.o 也没有问题。

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

并得到这个错误:
gcc: error: test_file1.o: No such file or directory gcc: error: file1.o: No such file or directory gcc: fatal error: no input files

这两个文件都在子文件夹build
哪里出了问题?

【问题讨论】:

  • 欢迎来到 Stack Overflow。看起来好像您发布的代码中有几个拼写错误。请尽量避免这种情况;您更容易为我们发现此类错误。

标签: c gcc makefile gnu-make


【解决方案1】:

问题在于,您的某些规则实际上并未构建他们声称构建的内容,违反了Mad Scientist's Second Law of Makefiles

Make 发现它必须构建 file1.o。该文件一开始不存在,并且 vpath 找不到尚不存在的文件。 所以 Make 查找规则并找到:

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

这条规则的目标是file1.o。 Make 假设这将构建 file1.o,执行它,然后尝试在另一个配方中使用 file1.o - 由于 file1.o 仍然不存在而失败。

该规则实际上构建了build/file1.o。不,Make 不够聪明,无法从配方中推断出这个事实。

解决办法:改变规则。

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

同样:

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

【讨论】:

  • 感谢您向我解释。我想让它干净且没有路径,但我认为这是不可能的。也感谢伟大的链接。
  • @mato0:我对 makefile 的指导之一是 Make 擅长使用文件 there 来构建文件 here,但反之则不然.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多