执行C程序时创建了多少个文件?

时间:2013-09-21 13:54:34

标签: c

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

3 个答案:

答案 0 :(得分:3)

这完全取决于特定的编译器,以及您如何构建程序。通常可以在一个步骤中直接编译和链接源代码。

gcc test.c -o test

不会留下任何中间文件。

答案 1 :(得分:3)

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

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

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

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

  3. 旧版本的gcc(可能还有新版本)会生成程序集,然后使用gas(GNU汇编程序)汇编。此步骤使用临时文件(扩展名为.S)完成。

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

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

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

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

      总结一下,在编译可执行文件时:

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

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

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

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

答案 2 :(得分:-1)

当我们以

运行C程序时
#include<stdio.h>
void main() {
    printf("hello");
}

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