1.C++语言的编译器及编译流程

1.C++编译器

编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。以下是一些主流的C++编译器及其简要用法:

  1. GNU Compiler Collection (GCC):’

    • GCC原名GNU C Compiler,后来逐渐支持更多的语言编译(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),所以变成了GNU Compiler Collection(GNU编译器套装),是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布,是大多数类Unix(如Linux、BSD、Mac OS X等)的标准编译器,而且适用于Windows(借助其他移植项目实现的,比如MingW、Cygwin等)。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。

    • 安装:在大多数Linux发行版上,你可以使用包管理器安装GCC。例如,在Ubuntu上,可以运行 sudo apt-get install g++

    • 编译:使用命令 g++ 后接源文件名,例如 g++ myfile.cpp

    • 生成可执行文件:./a.out(默认输出文件名)。

  2. Clang:

    • Clang 是一个基于LLVM的编译器前端,支持C、C++和Objective-C
    • 安装:在大多数Linux发行版上,你可以使用包管理器安装Clang。例如,在Ubuntu上,可以运行 sudo apt-get install clang
    • 编译:使用命令 clang++ 后接源文件名,例如 clang++ myfile.cpp
    • 生成可执行文件:./a.out(默认输出文件名)。
  3. Microsoft Visual C++ Compiler:

    • 通常与Visual Studio集成使用,使用Visual Studio创建项目,然后通过IDE进行编译和调试。
    • 也可以通过命令行使用,使用 cl 命令。例如,cl myfile.cpp 编译源文件。
  4. Intel C++ Compiler:

    • Intel C++ Compiler 是英特尔公司提供的优化C++编译器。它针对英特尔处理器进行了优化,可以生成高度优化的代码,并提供了一些高级优化技术,如向量化和多线程支持。
    • 安装:需要单独安装Intel Parallel Studio。
    • 使用:在命令行中,使用 icpc 后接源文件名,例如 icpc myfile.cpp
    • 生成可执行文件:./a.out(默认输出文件名)。
  5. MinGW-w64:

    • MinGW 是一个在 Windows 平台上使用 GCC 工具链的开发工具集合。它提供了 GCC 编译器套件的 Windows 版本,并通过命令行界面(CLI)提供与 GCC 类似的命令和选项。
    • 安装:可以使用MinGW-w64的安装程序或使用包管理器(例如MSYS2)安装。
    • 编译:使用命令 g++ 后接源文件名,例如 g++ myfile.cpp
    • 生成可执行文件:./a.exe(默认输出文件名)。

2.编译器工作流程

一个现代编译器的主要工作流程:

源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)。

在这里插入图片描述

  1. 预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释这些没用的东西都给扬了。
  2. 编译(Compiling):处理好之后,就可以正式开始编译,首先会编译为汇编代码。
  3. 汇编(Assembling):接着就该将汇编代码编译为机器可以执行的二进制机器指令了,会得到一个二进制目标文件。
  4. 链接(Linking):最后需要将这个二进制目标文件与系统库和其他库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。

以G++为例,编译一个cpp程序的代码为:

预处理:g++ -E main.cpp -o main.i
编译:g++ -S main.i -o main.s
汇编:g++ -c main.s -o main.o
链接:g++ main.o -o main
命令汇总:g++ main.cpp -o main
多文件一起编译:g++ main.cpp test.cpp -o main

3. 编译选项

C++编译器通常提供许多编译选项,这些选项允许你指定如何进行代码生成、优化、调试信息等方面的设置。以下是一些常见的C++编译选项:

  1. -c 生成目标文件而不进行链接,产生.o.obj文件,用于后续的链接阶段。

    g++ -c myfile.cpp
    
  2. -o 指定输出文件的名称。

    g++ myfile.cpp -o myexecutable
    
  3. -g 包含调试信息,方便在调试器中进行源代码级别的调试。

    g++ -g myfile.cpp
    
  4. -Wall 开启常见的警告信息,有助于发现潜在的问题。

    g++ -Wall myfile.cpp
    
  5. -O 启用各种优化级别,可以是 -O1, -O2, -O3 等。

    g++ -O2 myfile.cpp
    
  6. -std 指定所使用的C++标准版本。

    g++ -std=c++11 myfile.cpp
    
  7. -I 指定包含文件的搜索路径。

    g++ -I/path/to/include myfile.cpp
    
  8. -L 指定库文件的搜索路径。

    g++ -L/path/to/lib myfile.cpp
    
  9. -l 指定要链接的库。

    g++ myfile.cpp -lmylibrary
    
  10. -D 定义预处理宏。

    g++ -DDEBUG myfile.cpp
    
  11. -E:预处理(Preprocess)

    • 这个选项告诉编译器只执行预处理阶段,将源代码转换为经过宏展开、条件编译等处理的纯文本文件。
    • 不进行编译、汇编或链接,只生成预处理后的代码,通常使用.i扩展名。
    • 这对于查看宏展开后的代码或检查预处理阶段的问题很有用。
    g++ -E main.cpp -o main.i
    
  12. -S:生成汇编代码(Generate Assembly)

    • 这个选项告诉编译器执行预处理和编译阶段,但不进行汇编或链接。它生成的输出是汇编代码文件,通常使用.s扩展名。
    • 汇编代码是由机器指令和汇编语言构成的中间表示,可用于后续的汇编和链接。
    g++ -S main.i -o main.s
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js文件上传 分片上传/断点续传/极速秒传

(极速秒传)利用md5判断上传的文件是否存在 MD5信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。 每一个文件都会生成…

电磁波的信号加载说明

电磁波的信号加载电磁波(Electromagnetic wave)是由同相振荡 且互相垂直的电场与磁场在空间中衍生发射的振荡粒子波,是以波动的形式传播的电磁场,具有波粒二象性,其粒子形态称为光子,电磁波与光子不是非黑即白的关系,而…

Kubernetes 核心实战之一(精华篇 1/2)

文章目录 1,资源创建方式1.1 yaml1.2 命令行 2,NameSpace命名空间2.1 命令行创建ns2.2 yaml 创建ns 3,Pod3.1 命令行 创建pod3.2 yaml 创建pod3.3 可视化界面 创建3.3.1 Pod nginx3.3.2 Pod nginx tomcat3.3.3 Pod 2ngnix 1,资源…

日文游戏翻译 ,如何做好本地化翻译?

相关调查显示,日本游戏占据全球游戏市场约20%的份额,其销量一直都不错。市场上对于日语游戏翻译的需求也很大。那么,针对日文游戏翻译,如何做好本地化翻译? 首先、做好语言和文化上的本地化。这要求译员从翻译的文本到…

一篇关于大模型在信息抽取(实体识别、关系抽取、事件抽取)的研究进展综述

信息提取(IE)旨在从普通自然语言文本中提取结构化知识(如实体、关系和事件)。最近,生成式大型语言模型(LLMs)展现了在文本理解和生成方面的卓越能力,使得它们能够广泛应用于各种领域…

VINS-MONO拓展1----手写后端求解器,LM3种阻尼因子策略,DogLeg,构建Hessian矩阵

文章目录 0. 目标及思路1. 非线性优化求解器2. 基于VINS-MONO的Marginalization框架构建Hessian矩阵2.1 estimator.cpp移植2.2 solve.cpp/preMakeHessian()2.3 solve.cpp/makeHessian() 3. solve.cpp/solveLinearSystem()求解正规方程4. 更新状态5. 迭代求解6. EVO评估结果7. 待…

Certum ev多域名证书的优势

多域名证书作为一种能够为多个域名提供安全保护的证书类型,越来越受到企业的青睐。Certum作为一个成立了二十几年的CA认证机构,旗下的EV多域名SSL证书产品已经保护了多家企业的网站。Certum旗下的EV多域名证书作为一种能够为多个域名提供安全保护的证书类…

《Linux C编程实战》笔记:实现自己的myshell

ok,考完试成功复活 这次是自己的shell命令程序的示例 流程图: 关键函数 1.void print_prompt() 函数说明:这个函数打印myshell提示符,即“myshell$$”. 2.void get_input(char *buf) 函数说明:获得一条指令&#…

Dora-rs 机器人框架学习教程(1)—— Dora-rs安装

1、dora简介 Dora-rs[1] 是一个基于 Rust 实现的化机器人框架,其具有极高的实时性能。Dora-rs使用Rust语言做数据流的传输和调度管理,可以大大减少了数据的重复拷贝和传输。它提供了Rust语言和Python语言之间的无缝集成,减少了跨语言的性能代…

C++上位软件通过LibModbus开源库和西门子S7-1200/S7-1500/S7-200 PLC进行ModbusTcp 和ModbusRTU 通信

前言 一直以来上位软件比如C等和西门子等其他品牌PLC之间的数据交换都是大家比较头疼的问题,尤其是C上位软件程序员。传统的方法一般有OPC、Socket 等,直到LibModbus 开源库出现后这种途径对程序袁来说又有了新的选择。 Modbus简介 Modbus特点 1 &#…

高压继电器,未来几年市场将保持稳定增长

高压继电器是一种用于控制大功率电气设备的开关装置,广泛应用于电力系统、轨道交通、工业自动化等领域。随着各行业对电气控制需求的不断增加,高压继电器市场也在不断扩大。全球高压继电器市场分析: 在全球市场中,目前主要的高压继…

拒绝纸张浪费,Paperless-ngx开源文档管理系统将纸质版转换成可搜索的电子版档案

GitHub:GitHub - paperless-ngx/paperless-ngx: A community-supported supercharged version of paperless: scan, index and archive all your physical documents 在线演示:https://demo.paperless-ngx.com 官网:https://docs.paperless-n…

【力扣100】46.全排列

添加链接描述 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 思路是使用回溯if not nums:return []def dfs(path,depth,visited,res):# 出递归的条件是当当前的深度已经和nums的长度一样了,把path加入数组,然后出递归if …

手机流量卡推广分销网站php源码,多功能的号卡推广分销管理系统

源码简介 拥有多个接口,包括运营商接口,并支持无限三级代理。 最简单易用的PHP系统,它自带自动安装向导,可以让你轻松安装和部署。 该系统集成了多个第三方接口资源,能够满足你的不同需求。采用全系统双色主题&…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 2. True False 3. for 数值循环 in range() P69 4. for 遍历字符串,列表,元组,集合和字典 in obj P70 5. pass 空语句 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif …

机器学习中的监督学习基本算法-逻辑回归简单介绍

逻辑回归 逻辑回归(Logistic Regression)是一种用于解决二分类问题的统计学习方法,尽管名字中带有"回归"一词,但实际上它是一种分类算法。逻辑回归的主要目标是通过学习从输入特征到一个离散的输出(通常是0…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备,发现设备有时加密出来的数据,再解密时与明文对不上,怀疑是通信问题。因此,急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉,所以随便选了个log4cplus软件集成到现有工具…

以STM32为例,实现按键的短按和长按

以STM32为例,实现按键的短按和长按 目录 以STM32为例,实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态,并分别记录按键按下的持续时间,通过时间的长短…

百度百科词条创建多久可以通过?

一个优质的百度百科词条,能提升个人或企业的品牌形象。因此,越来越多的人希望创建自己的百度百科词条,那么,创建一个百度百科词条到底需要多久才能通过审核呢?接下来伯乐网络传媒就来给大家分享一下。 一、百度百科词条…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构,Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布,包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…