C中有个小库,由三个文件组成:
- lib.h - 代码
- test.c - 测试
- debug.h - 用于测试的附加代码。
我想编写一个 Makefile 以便:
- 编译所有文件
make。它们应该出现在目录中out。您不需要创建它,它始终存在,它包含文件.gitkeep,并且已添加到.gitignore. make test在→上运行测试.out/test -v。- 清理
make clean→上前两个动作的结果git clean -fdx out。
这是到目前为止的结果:
.PHONY: all test
out/lib: lib.h
gcc -o out/lib lib.h
out/test: test.c lib.h debug.h
gcc -o out/test test.c
all: out/lib out/test
test: out/test
./out/test -v
clean:
git clean -fdx out
问题 1:该命令make仅创建out/lib. 但是,make test它适用于它:首先编译out/test,然后启动。
UPD:我通过将目标放在和all: ...前面来修复它。现在两者走到了一起。然而,这不是必需的,前面描述的目标是相当公认的。我仍然不明白其中的逻辑。out/libout/testtest: ...
问题 2:IDE(带有 Makefile 插件的 CLion)以红色下划线标出目标中的先决条件out/lib并out/test显示消息“未解决的先决条件”并提示创建“创建规则”。我不明白为什么磁盘中的文件被声明为目标,但我不会这样做make lib.c。
我究竟做错了什么?几个小时前我遇到了 make,请随意解释最基本的事情。
您做错的第一件事是尝试使用一个单独的目录(来自当前源)来“堆叠”处理源的结果。正常做法:创建一个目录,将makefile,sources放入其中,处理它们(用程序
make),将处理结果保存在同一目录中。你做错的第二件事,或者更确切地说,误解,是选择了一个“默认”目标。也就是说,如果没有明确指定目标,将执行的目标make 。
因此,将执行第一个遇到的(或显式指定的)makefile 中遇到的第一个目标(搜索 makefile 的顺序,如果未使用选项显式指定名称:,,)。
-fGNUmakefilemakefileMakefile例如,如果您希望默认执行名称类似于 的目标
первая_цель,请将其放在首位。警告:原则上,目标的实现本身(和先决条件)可以留在文件“深处”的某个地方,但是你仍然需要在文件的开头放置一个“存根”:还值得一提的是一个特殊变量
.DEFAULT_GOAL,您可以用它覆盖“默认”目标。