我正试图使用Makefile
来管理项目周围的一些任务(例如打包以供分发)。但是,我找不到一种方法来依赖于特定的文件名,而不是一些自动魔术。参见示例:
+ $ cat Makefile
dist: ctl
echo "package it here"
+ $ tree
.
├── ctl
└── Makefile
0 directories, 2 files
+ $ make
echo "package it here"
package it here
如你所见,这很好用。但当我创建文件
ctl.h
和ctl.c
时它就停止工作了:+ $ touch ctl.{h,c}
+ $ make
cc ctl.c -o ctl
/usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/8.2.1/../../../../lib/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: ctl] Error 1
+ $ tree
.
├── ctl.c
├── ctl.h
└── Makefile
0 directories, 3 files
我的假设是
make
试图变得聪明,并认为ctl
是从ctl.c
编译的程序。但事实并非如此。我怎样才能抑制这种行为? 最佳答案
从ctl
创建ctl.c
的“隐式规则”仅在没有显式声明的规则创建ctl
时使用。例如,如果ctl
应该从源文件ctlcmd.c
和common.c
编译,则写入:
ctl: ctlcmd.o common.o
$(CC) $(CFLAGS) -o $@ $^
(将使用另一个隐式规则从
.o
文件创建.c
文件。)如果根本不需要重新创建
ctl
(例如,这是一个手写脚本),那么您可以为它编写一个虚拟规则,如下所示:# `ctl` is a hand-written file, don't try to recreate it from anything
ctl:
touch ctl
您还应该编写一些规则来告诉Make它应该如何处理
ctl.c
。关于c++ - 如何使目标取决于特定的文件名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54521460/