将命令行参数作为 Makefile 中的目标传递

发布于 2025-01-02 01:33:49 字数 610 浏览 0 评论 0原文

为了简化我的问题,如果我有一个如下的 Makefile,

    %: %.c
           gcc -o $@ $<

    make foo

Make foo 将从 foo.c 构建可执行文件 foo。没有问题。如果我要按如下方式更改 Makefile,以便可以从 Makefile 命令行传递目标,

    # To make things little complex
    TARG=$(EXE)
    $(TARG): %.c
            gcc -o $@ $<

    make EXE=foo

上面的命令 make EXE=foo 表示:

"make: *** 没有规则可以创建目标 %.c,foo' 需要。停止。`

为什么 $(TARG) 不是 在 Makefile 的 target 规则中得到扩展?

To simplify my question, if I have a Makefile as below

    %: %.c
           gcc -o $@ 
lt;

    make foo

Make foo will build the executable foo from foo.c. No issues. If I were to change the Makefile as below, so that I can pass the target from Makefile command-line

    # To make things little complex
    TARG=$(EXE)
    $(TARG): %.c
            gcc -o $@ 
lt;

    make EXE=foo

The above command make EXE=foo says:

"make: *** No rule to make target %.c, needed byfoo'. Stop.`

Why is $(TARG) not getting expanded in the target rule in Makefile?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雨轻弹 2025-01-09 01:33:49

我认为你需要 静态模式规则

TARG=$(EXE)

$(TARG):%: %.c
  gcc -o $@ 
lt;

make EXE=foo

I think you need Static Pattern rule

TARG=$(EXE)

$(TARG):%: %.c
  gcc -o $@ 
lt;

make EXE=foo
我只土不豪 2025-01-09 01:33:49

只需保留第一个示例中的代码并添加以下行:

.DEFAULT_GOAL := $(EXE)

或者(实际上是相同的)在任何其他规则之前添加不带配方的 $(EXE) : 规则。默认情况下,如果命令行上未指定任何内容,Make 将选择 Makefile 中定义的第一个目标。

Just leave the code from your first example and add the following line:

.DEFAULT_GOAL := $(EXE)

Or (which is effectively the same) add $(EXE) : rule with no recipe before any other rules. By default Make picks the first target defined in the Makefile, if nothing is specified on the command line.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文