7



我正在通过“Learn C the Hard Way”学习 C 编程。我目前正在进行练习 1,可以在这里找到:http ://c.learncodethehardway.org/book/ex1.html

我了解所涵盖的概念,但不了解编译过程。在命令行中使用“make”命令时,为什么会这样:

$ make ex1

这不起作用:

$ make ex1.c

实际上,直到一分钟前我才运行第二个命令。不过我最终想通了。在我这样做之前,我一直收到此错误消息:

make: nothing to be done for 'ex1.c'

虽然这只是一个技术问题,但我仍然想知道发生了什么。谢谢 :)

4

3 回答 3

12

两者都有效;他们只是做不同的任务。

  • make ex1.c说“使用makefile中的规则加上内置知识,确保文件ex1.c是最新的”。

    make程序找到ex1.c并且没有规则可以从其他东西构建它(例如,没有 RCS 或 SCCS 源代码),因此它报告“无事可做”。

  • make ex1说“使用makefile中的规则加上内置知识,确保文件ex1是最新的”。

    make程序发现它知道一种ex1从源文件创建可执行文件的方法ex1.c,因此它确保源文件ex1.c是最新的(它存在,所以它是最新的),然后确保源文件也是ex1最新的(这意味着 'fileex1的修改时间比 ' 更近ex1.c)。如果您在ex1.c上次运行make后进行了编辑,它将进行编译以使其ex1ex1.c. 如果编译失败,该文件ex1将不存在,因此您下次也将获得另一个重新编译。并且一旦它是最新的,在您再次修改源之前make不会ex1再次重建。

这是make设计工作的方式。

于 2013-03-24T18:53:24.503 回答
4

目标make通常指定您希望它构建或重建的东西,而不是您希望它用来构建其他东西的东西。

如果您键入ex1.c(并且没有自动生成它的规则),make 基本上只是回答“是的,该文件存在”。

于 2013-03-24T18:48:40.170 回答
1

make工具的参数是它将帮助您创建的可执行文件的名称。它不应该有.c扩展名。你应该只写make ex1

于 2013-11-05T21:15:35.590 回答