当我们用 C 语言编程时,会创建多少个文件,例如一个“.exe”和一个“.obj”。是否创建了任何其他文件?谢谢!
3 回答
答案很大程度上取决于特定的编译器(gcc/msvc/clang)、编译器的版本、系统的架构,以及您是否要求编译器生成调试信息。@GrahamBorland的答案是正确的,因为gcc test.c -o test
它将创建一个只有一个文件的网络,test
. 但是,这是因为gcc
调用编译器和链接器,然后在返回之前删除临时文件和中间目标文件 (.o)。
在编译期间,编译器通常会生成几个临时文件,然后将其删除以进行清理。常见的有:
C 编译器首先通过预处理器运行代码,并且经常使用临时文件来存储结果。
几乎所有现代编译器都将 C 简化为可以更好地优化的中间语言。这通常存储在临时文件中。
旧版本的 gcc(也可能是新版本)会生成汇编,然后使用
gas
(GNU 汇编器)进行汇编。此步骤是使用临时文件(扩展名为 .S)完成的。
然后编译阶段的结果会生成一个或两个文件:
包含已编译但未链接代码的目标文件(大多数 Unices 为 .o,Windows 为 .obj)。此代码无法执行;它具有链接阶段必须满足的外部依赖项(系统库,可能还有其他库)。
如果用户请求调试信息(
-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)也作为编译器和链接器的前端驱动程序运行。在这种情况下,编译器可能会删除任何不需要的临时文件,例如编译阶段生成的目标文件。
这完全取决于特定的编译器,以及您构建程序的方式。通常可以在一个步骤中将源代码直接编译并链接到可执行文件。
gcc test.c -o test
不会留下任何中间文件。
当我们运行 C 程序时
#include<stdio.h>
void main() {
printf("hello");
}
然后编译器只创建.bak
文件。我们也可以从文件中获取源.bak
文件。