我正试图使用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.hctl.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.ccommon.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/

10-10 19:30