编译器和链接器有什么区别?

54

在C语言中,编译器和链接器有什么区别?

3个回答

92

编译器将用人类可读的编程语言编写的代码转换为机器码表示形式,该表示形式可以被您的处理器理解。这一步骤创建了目标文件。

编译器完成此步骤后,需要另一步骤来创建一个可被调用和运行的工作可执行文件,即关联编译后的代码需要调用的函数调用。例如,您的代码可能会调用 C 标准库中的例程 sprintf,而您的代码中没有实际执行 sprintf 提供的服务的内容,它只是报告必须调用,但实际代码位于公共 C 库中的某个地方。为了执行这些(和许多其他)链接,必须调用链接器。链接之后,您将获得实际可运行的可执行文件。


37
+1 很好的解释。需要注意的是,大多数操作系统实际上涉及到两个链接器:编译后生成可执行文件的链接器(通常称为“链接器”),以及在执行时链接动态加载库(也称为.so或.dll)的链接器(通常称为“动态链接器”)。 - sleske

29

编译器从源代码生成目标代码文件(机器语言)。

链接器将这些目标代码文件组合成一个可执行文件。

许多集成开发环境按顺序调用它们,因此您实际上看不到链接器的工作过程。有些语言/编译器没有独立的链接器,链接是由编译器作为其工作的一部分完成的。


0
简单来说,当一个“.obj”文件需要与其库函数链接时(编译器不理解什么是scanf或printf等),链接器就会发挥作用。如果没有错误,编译器只会将“.c”文件转换为“.obj”文件,而不理解我们使用的库函数。因此,为了将“obj”文件制作成“exe”(可执行文件),我们需要链接器,因为它使编译器理解库函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接