os x 编译 c 源码-10分钟看懂C++编译流程

C++ 是一种高性能编程语言,广泛应用于世界上最前沿的技术应用——从数据挖掘和大数据到手动驾驶车辆和机器人,再到视频游戏和视频处理。 到处。 作为一名 C++ 程序员,您已经非常精通该语言,并且对多线程和并行编程等主题有一定的了解。 但是你有没有揭开编译器的神秘面纱,有没有好奇过编译过程中会发生什么?

这是一个特别值得讨论的问题。 在今天的文章中,我们将详细讨论您最需要了解的几个关键细节。 了解编译器的内部工作原理可以帮助你更深入地理解代码,避免很多常见的“坑”,从而进一步提高你的编程技能。

编译过程

现在,让我们打开编译器的“小黑匣子”,用最简洁的方式解释一下C++编译器对你的代码施展了什么“魔力”。

作为一种中级编程语言,C++ 使程序员的编程变得更加容易——低级机器语言的僵化本质使得不可能编写足够复杂的现代应用程序。 编译器通过将 C++ 源代码转换为计算机可以执行的二进制文件来填补中间 C++ 语言和机器语言之间的空白。

总的来说,编译过程比较复杂,一般可以分为三个阶段:

预处理预处理

在实际编译工作开始之前,预处理器指令指示编译器暂时扩展源代码,为后续步骤做准备。

在C++中,预处理指令以#号开头,如#include、#define、#if等。在这个阶段,编译器会一一处理C++源代码文件。 对于#define指令,编译器将源代码中的宏替换为宏定义中的内容; 对于#if、#ifdef 和#ifndef 指令,编译器会选择性地跳过或选择部分源代码; 对于 #include 指令,编译器会将相应库的源代码插入到当前源代码中 - 这通常是一些通用声明。 #include 指令引入的头文件 (.h) 通常包含大量代码。 包含的内容越多,最终的预编译文件就越大。 一般来说,预编译的文件会比原始的C++源代码大。

通过这些替换和插入操作,预处理器形成一个合并的输出文件。 预处理器会在代码中插入标记,以便编译器可以识别每一行来自哪个文件,以便在调试时生成相应的错误消息。 这些错误消息可以在开发和调试 C++ 程序时为您提供很大帮助。

Compilation & assemblyCompilation & assembly 编译与汇编

在此阶段,编译器通过连续的两个步骤将预处理器形成的代码编译成目标文件。

首先,编译器将纯 C++ 代码(消除了预编程的处理器指令)编译为低级汇编代码。 在这一步中,编译器将对代码进行检测和优化,指出句型错误、重载解析错误以及其他各种编译错误。 在C++中,如果一个对象只被声明但没有定义,编译器仍然可以从源代码中形成一个对象文件——因为这个对象还可以指向当前代码中尚未定义的各个标识符。

其次,汇编器将上一步生成的汇编代码逐行转换为字节码(即机器码)。 事实上,如果您想分别编译代码的不同部分,可以在这一步之后停止编译过程。 这一步生成的目标文件可以放在一个称为静态库的包中供后续使用——也就是说,如果只更改一个文件,则无需重新编译整个项目的源代码。

链接

链接器在编译器形成的目标文件的帮助下生成最终结果。

在此阶段,编译器将链接上一阶段编译器生成的各个目标文件,并将所有对未定义标识符的引用替换为其对应的正确地址。 如果不链接目标文件,就很难生成可以正常工作的程序 - 它就像没有页脚的目录,没有任何好处。 链接器完成链接工作后,根据编译目的的不同,将链接结果生成为动态链接库或可执行文件。

链接过程还会抛出各种异常,通常是重复定义或缺少定义等错误。 不仅没有定义,如果您忘记导出对库或目标文件的引用以便链接器可以找到定义,也会发生此类错误。 重复定义则恰恰相反。 当两个库或目标文件包含同一标识符的定义时,可能会出现重复定义错误。

了解编译过程有什么好处?

当您对编译过程的各个阶段有了新的了解时,您也将能够更好地理解编译错误或链接错误的原因,并防止此类潜在的与编译相关的问题。 例如,如果您了解预处理过程,还可以借助头文件防护(用于保护头文件内容不被错误包含多次的预编译器指令)来防止一些编译错误。

充分理解C++编译的细节,可以让你从一个完全不同的角度来看待整个编程过程,也让你对原来认为理所当然的编译过程有一个新的认识。

如何使用C++编译器

构建和运行 C++ 程序所需的基本步骤是:

使用编辑器或编程环境 (IDE),使用正确的语法构建 C++ 源文件。 运行编译器编译源文件并生成可执行文件。 运行生成的文件。

即使同一编译器的不同版本之间,编译器功能也有很大差异; 同样,它们的选项也非常丰富,比如代码生成、调试、浮点行为、库处理等,都有相当大的差异。 有很多选择。

C++ 编译器概述

现在您对 C++ 编译有了一定的了解os x 编译 c 源码,您应该使用哪种编译器?

一般来说,您可以根据编译器的许可证类型(免费或付费)、使用方式(本地安装或在线编译)以及它们支持的操作系统(Windows、OS X 或 Linux)对编译器进行分类。

以下是一些建议:

除了代码编辑器之外,一些 IDE 还包含编译器。 例如macOS上的Xcode,Windows上的Visual Studio等。此外,还有很多专门的编译器,例如Intel C++编译器等,它们有一些针对特定需求专门定制的功能。 例如,英特尔的编译器可以在自己的处理器上更有效地使用多核架构,生成的代码可以在英特尔的硬件上运行得更快。 这种专门的编译器通常需要用户购买昂贵的许可证才能使用它们。

如果您发现自己正在考虑使用不太流行的编译器,请仔细查看其标准合规性。 避免使用这些不符合 ISO 标准或不提供标准库的可靠实现的编译器。 这里所说的“标准库”是C++自带的大量库文件; 而“库文件”则是已经被“打包”的预编译代码的集合,可以在其他程序中重复使用。

一些编译器和库嵌入在软件开发工具(IDE)提供的框架中。 这些框架很有用,但如果您准备更改工具链,可能很难摆脱它们。

在线C++编译器

在线编译器是一个有用的工具,它可以让您快速编译代码,而无需在笔记本电脑上安装完整的编译工具链。 这使得程序员可以更轻松地操作代码、熟悉最新的语言特性,或者在线共享代码片段、实时协作编辑以及测试各种编译器。 除了狭义的“编译”功能外,大多数在线编译器都会执行编译后的程序并显示输出结果。

与离线编译器一样,在线编译器支持的 C++ 标准版本及其提供的功能差异很大,从使用标志标志定义编译参数到处理标准输入以及传入命令行和运行时参数等待。

常用的在线编译器有以下几种:

您还可以在这里听到更多在线编译器的列表,按特征排序。

总结

在本文中os x 编译 c 源码,我们介绍了 C++ 编译过程的各个阶段,并更详细地了解了整个过程。 通过学习如何使用 C++ 编译器并概述各种 C++ 编译器,您可以了解编译过程的幕后情况并对其有深入的了解。 希望对您有所帮助。

想要了解有关 C++ 编译过程的更多详细信息吗? 想了解更多关于 C++ 的知识吗? 欢迎申请我们的C++纳米学位课程!

(本文已投稿《Udacity》,原作者:Stephen Welch 翻译:请保留此信息,以便欧莎转载)

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 os x 编译 c 源码-10分钟看懂C++编译流程 https://www.wkzy.net/game/200360.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务