0

当我们用 C 语言编程时,会创建多少个文件,例如一个“.exe”和一个“.obj”。是否创建了任何其他文件?谢谢!

4

3 回答 3

3

答案很大程度上取决于特定的编译器(gcc/msvc/clang)、编译器的版本、系统的架构,以及您是否要求编译器生成调试信息。@GrahamBorland的答案是正确的,因为gcc test.c -o test它将创建一个只有一个文件的网络,test. 但是,这是因为gcc调用编译器和链接器,然后在返回之前删除临时文件和中间目标文件 (.o)。

在编译期间,编译器通常会生成几个临时文件,然后将其删除以进行清理。常见的有:

  1. C 编译器首先通过预处理器运行代码,并且经常使用临时文件来存储结果。

  2. 几乎所有现代编译器都将 C 简化为可以更好地优化的中间语言。这通常存储在临时文件中。

  3. 旧版本的 gcc(也可能是新版本)会生成汇编,然后使用gas(GNU 汇编器)进行汇编。此步骤是使用临时文件(扩展名为 .S)完成的。

然后编译阶段的结果会生成一个或两个文件:

  1. 包含已编译但未链接代码的目标文件(大多数 Unices 为 .o,Windows 为 .obj)。此代码无法执行;它具有链接阶段必须满足的外部依赖项(系统库,可能还有其他库)。

  2. 如果用户请求调试信息(-g在 gcc 下),则根据体系结构和其他编译标志,编译器可能会生成一个文件(或目录),其中包含用于调试的符号信息。Mac OS X 中的编译器生成包含调试信息的 .dSYM 目录。在 Linux 下,这通常嵌入在对象 (.o) 文件中。

最后,Mac、Unix 和 Windows 有一个链接阶段,它获取目标文件(.o 和 .obj)和任何所需的库(Linux 下的 .a 和 .so;Mac 下的 .a、.dylib 或框架OS X;Windows 下的 .lib 或 .dll),并生成可执行文件。这是生成可执行文件(Windows 下的 .exe)文件的阶段。

总而言之,在编译可执行文件时:

  • C 编译器经常创建(然后删除)许多临时文件。

  • C 编译器生成一个或多个目标文件。

  • 链接器生成一个可执行文件,也可以创建(和删除)临时文件。

  • 一些 C 编译器(例如 gcc)也作为编译器和链接器的前端驱动程序运行。在这种情况下,编译器可能会删除任何不需要的临时文件,例如编译阶段生成的目标文件。

于 2013-09-21T14:21:45.930 回答
3

这完全取决于特定的编译器,以及您构建程序的方式。通常可以在一个步骤中将源代码直接编译并链接到可执行文件。

gcc test.c -o test

不会留下任何中间文件。

于 2013-09-21T13:57:41.103 回答
-1

当我们运行 C 程序时

#include<stdio.h>
void main() {
    printf("hello");
}

然后编译器只创建.bak文件。我们也可以从文件中获取源.bak文件。

于 2015-01-28T15:18:29.883 回答