gpt4 book ai didi

c++ - 如何使目标依赖于特定的文件名?

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

我正在尝试使用 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.c 创建 ctl 的“隐式规则”仅在没有明确规定的创建 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/

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