2011-03-19 80 views
5

有人可以向我解释为什么,特别是我们使用./a.out来运行程序吗?在Linux中运行C程序

这背后有什么意思吗?

有人可以提供一个解释吗?

+2

欢迎来到SO。你能不能更精确地提出你的问题。你不明白的是什么? 'a.out'前面的'./'? 'a.out'本身?你在寻找什么样的意义? – 2011-03-19 10:30:43

回答

3

如果您的意思是./部件,这是为了安全起见。 Windows默认将当前目录附加到PATH,这是不好的(存在DLL注入风险,等等)。 如果您的意思是a.out部分,它只是一个名称(来自格式a.out的名称),您可以通过修改gcc -o参数来更改该名称。

+0

其他的方法。格式“aout”(不再用于任何现代系统)的名称来自文件名“a.out”,它是unix系统上“汇编输出”的传统文件名。 – 2011-03-19 14:33:39

9

该名称代表"assembler output",并且(并且仍然是)编译器生成的可执行文件的默认名称。之前需要./的原因是因为当前目录(.)不在$PATH中,因此必须明确给出可执行文件的路径。

2

当像bash这样的shell运行一个可执行文件时,可执行文件必须位于您的PATH环境变量bash中才能找到并运行程序。

./前缀是指定可执行文件完整路径的简写方式,因此bash不需要咨询PATH变量(通常不包含当前目录)来运行它。

[供a.out(简称“汇编输出”),它是用于像gcc一个编译器的默认可执行输出如果没有指定输出文件名。]

0
gcc -o mynewprogram mynewprogram.c 

a.out的是默认名称编译器。 AFAIK这是因为链接过程被跳过,它不被编译为对象或库。

+2

不知何故,这并没有描述*背后的*意思。 – 2011-03-19 10:25:45

+0

这只是语法,请原谅我。 – Bytemain 2011-03-19 10:28:00

1

这将是值得你多看一点C和C程序的编写方式编译

本质上,源代码被发送到预处理器,其中相同#define#include指令被加载(例如,到存储器)。因此,您要使用的任何库都已加载,例如

#include <math.h> 

将基本上“粘贴”的math.h在在该点它被定义的内容插入源代码。

一旦所有的这些东西已经扩大了,在编译将您的源代码转换为目标代码,这是在二进制代码的来源。 a.out是输出的默认名称,如果您未指定生成名称。