【问题标题】:Executing a compiled C program执行已编译的 C 程序
【发布时间】:2013-06-28 23:22:41
【问题描述】:

我编译了一个名为 main.c 的愚蠢的小“hello world”C 程序:

gcc main.c

不出所料,出现了一个名为 a.out 的文件,他们说这是一个可执行文件。从同一个目录,如果我输入

a.out

然后按回车,它说“找不到命令”。但是如果我输入

./a.out

它根据需要说“你好世界”。我从未见过需要在其前面运行“./”的可执行文件。为什么是现在?

【问题讨论】:

标签: c compilation executable


【解决方案1】:

所有不在您的PATH 中的可执行文件都需要从根/ 或本地目录./ 的显式路径才能运行。快速搜索会发现具有基本相同问题的其他主题:

Why do you need ./ (dot-slash) before script name to run it in bash?

这还具有帮助您在 shell 中自动完成的额外好处(假设它支持它)。如果您只键入 aTabTab 那么它将列出 路径中以“a”开头的每个可执行文件 .但是,如果您键入 ./aTab,它可能会自动完成为 a.out,因为它只会查看当前目录中以“a”开头的可执行文件。所以,这样看,“./”实际上节省你键入几个键!

【讨论】:

  • 这个答案可能会受益于PATH是什么的解释
  • @TaylorFlores - 现在有链接了 :)
【解决方案2】:

在 Unix 和 Linux 中,路径中不包含当前工作目录是标准做法。如果您想要 MSDOS/Windows 行为,请更改您的 PATH 变量以包含 . 作为第一个目录。

【讨论】:

    【解决方案3】:

    这是因为系统正在寻找 a.out 或任何其他 exec。文件在一些特殊的路径。默认情况下(通常),当前目录不在该列表中。

    查看此类路径的列表:

    $ env|grep PATH
    

    您可以将这样的当前目录添加到 PATH 环境中。变量:

    $ export PATH=$PATH:.
    

    但您最好避免这样做并运行 ./a.out。 这样的技术。让我们了解我们正在从当前目录运行指定文件, 不是来自另一个(可能)目录的同名文件。所以,我们确切地知道我们运行的是什么。

    【讨论】:

    • 你可以简单地输入echo $PATH,而不是grepping env。
    【解决方案4】:

    当您在 Linux 终端中键入 a.out 之类的内容时,您暗示您要运行一个名为 a.out 的命令。默认情况下,终端不会在当前目录中查找这些命令,而是在PATH - 一组可执行程序的目录中查找。通常是这些目录:

    • /bin
    • /usr/bin
    • /usr/local/bin
    • 以及其他(您可以通过运行echo $PATH 来检查它们)

    如果程序不在PATH 的目录之一中,您必须指定程序的directory 目录才能运行。例如:

    • ./a.out 有效,因为 . 指的是您所在的目录
    • 如果a.out 在父目录中,../a.out 可以工作(.. 指父目录) 目录
    • projectdir/a.out 也可以,如果你的程序在子目录中,projectdir

    【讨论】:

      【解决方案5】:

      那是因为a.out 不在您的$PATH 中。
      您提供的命令由 shell 在$PATH (environment variable in linux) 中搜索。

      $PATH 基本上是目录列表。当您提供可执行文件名称时,shell 在$PATH 提供的目录中搜索它。

      由于a.out 不在您的$PATH 中,您必须明确提供a.out 的路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 2016-02-01
        • 2011-08-05
        • 1970-01-01
        • 2019-02-05
        • 2012-05-03
        相关资源
        最近更新 更多