【问题标题】:Simple compiling using a Makefile?使用 Makefile 进行简单编译?
【发布时间】:2015-03-25 19:09:18
【问题描述】:

我在理解 Makefile 的概念时遇到了一些麻烦。我正在用 C 编写一个项目,我有两个 .c 文件需要一起编译才能运行程序。我和其他人讨论了一些概念,但仍然无法掌握 Makefile 的概念。这就是我所拥有的。

生成文件:

hs.c:
        gcc -o hs hs_util.c hs.c

hs.c 依赖于 hs_util.c 的函数来完成任务。我知道这一点是因为包含了 hs_util 的头文件...

在 hs.c 中:

#include "hs_util.h"
#include "hs_config.h"

在 hs_util.c 中

#include "hs_config.h"
#include "hs_util.h"

当我运行“make”命令时,它显示“make: 'hs.c' is up to date”。这很好,但没有创建 hs 文件。我做错了什么?

【问题讨论】:

  • 查看this 和其他示例
  • Make 只是一个声明依赖关系的工具,真的。如果文件比其依赖项之一旧,Make 会看到这一点,并运行您指定的操作来修复这种情况。这样,如果 Makefile 中的依赖项是正确的,则永远不会编译不需要编译的任何内容。这就是Make的目的。当它说“X 是最新的”时,它的意思是,“我找不到重新编译 X 的任何理由;所以我不会。”

标签: c gcc compilation makefile


【解决方案1】:

您告诉它构建hs.c 而不是hs。所以它尝试了但它存在,并且你没有告诉它任何其他文件会迫使它认为文件已过期(这很好,因为你不想要那个)。

你想要:

hs:
        gcc -o hs hs_util.c hs.c

但这还不够。这只会构建一次然后停止(您需要删除 hs 才能再次构建)。

您需要教 make 关于制作目标 (hs) 的输入文件。

hs: hs_util.c hs.c
        gcc -o hs hs_util.c hs.c

完成后,您可以使用automatic variables 来避免重复自己。

hs: hs_util.c hs.c
        gcc -o $@ $^

完成后,您实际上可以利用 make built-in rules 并执行此操作。

hs: hs_util.o hs.o

如果你还想告诉 make 它需要在 .h 文件更改时重建 .o 文件,你可以添加这个。

hs.o hs_util.o: hs_util.h hs_config.h

请记住,make 规则的一般形式是 (example, syntax):

output-file: input-file
    commands to generate output-file from input-file

【讨论】:

  • 天哪,我现在明白了!非常感谢。我不知道 .o 文件是什么。感谢大家的帮助!
  • .o 文件是目标文件。您不需要它们来执行此操作,但内置规则会使用它们。
【解决方案2】:

我认为你有一个小错误。您的 makefile 想要构建一个目标“hs.c”

尝试更改以下内容:

> hs.c:
>         gcc -o hs hs_util.c hs.c

hs:
        gcc -o hs hs_util.c hs.c

【讨论】:

  • 哦,我明白了!非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多