【问题标题】:Difference between compiled filename and source filename. C编译文件名和源文件名之间的差异。 C
【发布时间】:2021-12-21 19:17:10
【问题描述】:

我刚开始学习 C,我想知道:

  • 编译后的文件名和源文件名有什么区别?

例如,为什么我想要一个已编译的文件名 cat 和源文件名cat.c

【问题讨论】:

  • 因为cat.c 是编译和链接以创建可执行文件cat 的源代码。第一个是文本,第二个是二进制。这就像一堆零件和一辆汽车之间的区别——第一个几乎没有用,而第二个可以带你去市场旅行。或者一头牛和一块牛排 - 第一个可以四处走动并吃掉你的草坪,而你实际上可以做饭和吃第二个。
  • 你不能运行cat.c,但你可以运行cat。你不能编译cat,但是你可以编译cat.c
  • @KenWhite 好的,这意味着我的cat 文件是a.out
  • 不,实际上。我应该更清楚。 cat.c 是源,它被编译成二进制目标文件cat,然后(连同任何必要的库或其他目标文件)链接到cat.out,您可以实际运行它。看@PalLaden给你的帖子,把assembly code换成c code;那里解释得很好。

标签: c


【解决方案1】:

可执行文件的名称可以是任何名称,只要操作系统可以接受即可。

默认情况下,一些构建工具将可执行文件命名为a.out。在许多常见的 Unix 工具中,这很容易通过命令行开关 -o <i>name</i> 进行更改,它表示将输出文件放在名为 <i>name</i> 的文件中。

可执行文件自动成为命令,因为当在命令行 shell 中键入命令并且它不是内置于 shell 中的命令时,shell 会查找具有该名称的文件,如果它是可执行的,它会执行文件。使用此功能时,您希望文件名对用户有意义。 a.out 不是通用的,也不是特别有意义,因此程序通常被赋予其他名称。

对于简单的程序,唯一源文件或主要源文件的名称通常用作可执行文件的名称(反之亦然),但源文件作为指定其编程语言的扩展名(如@ 987654325@),而可执行文件要么没有扩展名,要么有一些扩展名,如.exe(表示“可执行文件”)。

命令行 shell 可能只在某些目录中查找可执行文件。通常可以告诉他们在当前目录中搜索,但这不是一个好主意,因为它很容易在打算运行另一个程序时意外运行一个程序。特别是,如果 shell 对搜索可执行文件的位置松懈,攻击者可能能够让一个人或程序运行攻击者控制的程序。因此,您通常需要使用./<i>name</i>来运行当前目录下的程序,这表明您是故意要在当前目录下运行程序。

许多人在他们的主文件夹中指定一个目录,他们放置可执行文件并将该目录添加到他们的 shell 搜索可执行文件的路径中。

【讨论】:

    【解决方案2】:

    一种编程语言要么是“解释的”,要么是“编译的”(或两者兼有)。

    解释型语言就像 Python:您可以输入单独的表达式,当您按下回车键时,它们将被计算。

    C 和 Java 都是编译语言:您不能输入单独的命令。相反,您必须先将代码“编译”成可执行的二进制格式。

    按照惯例,如果我们想要调用prog 的C 程序,我们将在prog.c 中拥有我们的C 源代码,并将我们的可执行文件编译到文件prog

    如果您想知道如何编译 C 程序,gcc -o prog prog.c 是很好的开始。如果您对编译有任何疑问,请随时发表评论。

    【讨论】:

    • 附注:实际上,有 Python 的编译器和 C 的解释器。当然,常见的方式更多,呃,常见的。还有各种各样的“中间人”。
    • @thebusybee 非常真实! SML 和 Scala 也是可以解释或编译的语言示例。这是一个被诅咒的问题:GDB 是否可以被视为 C 解释器?
    【解决方案3】:

    在 C 和 C++ 等编译语言中,您只能运行编译文件。在这些语言中,您无法运行源文件。你把基于文本的源文件编译成二进制编译文件(可执行文件),这样你就可以运行程序了。

    您几乎可以为任一文件命名,但它们必须保持独立且不同的文件,因为一个是从另一个生成的。

    【讨论】:

    • 该问题没有询问文件之间的差异。它询问文件名之间的差异。
    • @EricPostpischil,也许吧。根据用户可能有限的体验,这很难说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多