gpt4 book ai didi

c - Makefile 无法在子文件夹中找到文件

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:11 26 4
gpt4 key购买 nike

我正在尝试用 C 为我的项目编写 Makefile。
我在 src 子文件夹中有我的 .c 文件,
.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: 错误: test_file1.o: 没有那个文件或目录
gcc: 错误: file1.o: 没有那个文件或目录
gcc: fatal error : 没有输入文件

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

最佳答案

问题是你的一些规则实际上并没有构建他们声称要构建的东西,违反了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 $@

关于c - Makefile 无法在子文件夹中找到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com