【问题标题】:How to make a basic C makefile?如何制作一个基本的 C makefile?
【发布时间】:2017-11-25 07:42:36
【问题描述】:

我正在尝试为 c 中的 hello world 程序制作一个简单的 Makefile 目前,我编译:

gcc -Wall -std=c99 helloWorld.c

在 Makefile 中我目前拥有的是:

CC = gcc
CFLAGS = -Wall -std=c99

helloWorld.exe: helloWorld.c
    $(CC) $(CFLAGS) -o helloWorld.exe

另外,这是一个制表符,而不是第二行中的空格
当我输入 make 或 make --trace 时,我得到:

make: *** 没有指定目标,也没有找到 makefile。停下来。

【问题讨论】:

  • 您的 Makefile 存在一些问题,但这些问题已在下面的答案中得到解决。我只是想确保您知道:$(CC) 前面的空格是 字符。如果您是 make 的新手,很容易错过这一点……有些编辑会默默地用空格替换制表符。
  • 编辑您的问题以显示make --trace 和/或make 的输出
  • 您的 make 文件的实际名称是什么?运行 make 时是否在该目录中?
  • make 文件的名称是 Makefile,它与我正在编译的 c 文件位于同一目录中,是的,我也在该目录中
  • 您在什么操作系统上执行此操作?我希望你使用 Linux 或一些 POSIX 系统

标签: gcc makefile


【解决方案1】:

阅读documentation of make。请注意,TAB 字符在Makefile-s 中是显着(大多数其他build automation 系统,例如ninja,没有这种历史错误特征)。您的问题和我的回答没有显示这些选项卡,但您需要确保它们存在(此处以 几个 空格开头的每个代码行都应该以单个制表符开头)。

helloWorld.exe: helloWorld.c
    $(CC) $(CFLAGS) -o helloWorld.exe

错误。您不会将helloWorld.c 传递给gcc

你至少想要

 helloWorld.exe: helloWorld.c
     $(CC) $(CFLAGS) -o helloWorld.exe helloWorld.c

您可以(并且实际上应该)使用$@$^ 特殊品牌automatic variables。还要注意内置规则(尝试make -p)。 也许在您的系统上只有helloWorld.exe: helloWorld.c 而没有明确的操作可能就足够了。我建议使用具有适当规则的常用clean: 目标。

如果invoking GCC,您可能希望在Makefile 中显式设置:

CFLAGS= -Wall -g

因为您应该询问所有警告和调试信息(因为如果没有要求,gcc 不会生成它们)。

要调试您的Makefile:首先尝试make -n。然后make --trace 并可能使用remake-x

您会发现很多 Makefile 的示例,例如this.

确保在Makefile 的每个版本之后清理你的文件树(要么有一个好的 - 但仍然缺少 - clean 目标,然后是 make clean,或者通过删除任何目标文件和任何可执行文件手动删除)。

当我输入makemake --trace 时,我得到:
make: *** No targets specified and no makefile found.

这意味着您在错误的目录中运行 make 命令。在运行make 之前检查pwd/bin/pwd 你的working directory。它可能不是你相信的那样。还列出其中的文件(在 Linux 和 POSIX 上使用 ls,在 MSDOS 和 Windows 上使用 DIR);您至少应该同时看到您的MakefilehelloWorld.c

还要检查您的 PATH variable 是否正确(例如,在 POSIX 系统上使用 echo $PATH)。

PS。我对.exe 后缀感到惊讶。在我的 Linux 系统上,我不使用也不需要它。

【讨论】:

  • 所以我在第二行的 helloWorld.exe 之后添加了 helloWorld.c 但它仍然不起作用。如果这有什么不同,我正在使用 cygwin 的 Windows 上。
  • 然后编辑您的问题以至少显示make --trace 的输出,并检查您的Makefile 是否正确包含制表符。
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2018-04-04
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多