编译器和链接器有啥区别?
Posted
技术标签:
【中文标题】编译器和链接器有啥区别?【英文标题】:What are the differences between a compiler and a linker?编译器和链接器有什么区别? 【发布时间】:2011-04-19 09:08:19 【问题描述】:C 中的编译器和链接器有什么区别?
【问题讨论】:
【参考方案1】:编译器会将以人类可读的编程语言编写的代码转换为您的处理器可以理解的机器代码表示。此步骤创建 object 文件。
编译器完成此步骤后,还需要另一个步骤来创建可以调用和运行的工作可执行文件,即关联您的编译代码需要调用才能工作的函数调用(例如) .例如,您的代码可以调用 sprintf
,这是 C 标准库中的例程。您的代码与sprintf
提供的实际服务没有任何关系,它只是报告必须调用它,但实际代码位于公共 C 库中的某个位置。要执行此(以及许多其他)链接,必须调用 链接器。链接后,就获得了可以运行的实际可执行文件。
【讨论】:
+1 很好的解释。请注意,在大多数操作系统上,实际上涉及 两个 链接器:在编译后运行并生成可执行文件的链接器(通常称为“链接器”),以及链接动态加载库的链接器(又名 .so 或 .dll)在执行时(通常称为“动态链接器”)。【参考方案2】:编译器从源代码生成目标代码文件(机器语言)。
linker 将这些目标代码文件组合成一个可执行文件。
许多 IDE 会连续调用它们,因此您永远不会真正看到链接器在工作。一些语言/编译器没有不同的链接器,链接是由编译器作为其工作的一部分完成的。
【讨论】:
【参考方案3】:简而言之 -> 每当需要将“.obj”文件与其库函数链接时,链接器就会发挥作用,因为编译器不理解什么是(scanf 或 printf. .etc) ,如果没有错误,编译器只是将 '.c' 文件转换为 '.obj' 文件,而不了解我们使用的库函数。因此,要将“obj”文件转换为“exe”(可执行文件)我们需要链接器,因为它使编译器能够理解库函数。
【讨论】:
以上是关于编译器和链接器有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章