g++和 gcc 编译入门教程

GNU

GNU 编译器集合(GNU Compiler Collection,简称 GCC)是一个由自由软件基金会(Free Software Foundation,简称 FSF)开发的编译器系统,它是 GNU 项目的一部分。GCC 支持多种编程语言,并且是许多开源项目和操作系统中的标准编译工具。

支持的语言

  • C:ISO C 标准和 GNU C 扩展。
  • C++:ISO C++ 标准和 GNU C++ 扩展。
  • Objective-C:支持 Objective-C 语言和 GNU Objective-C 运行时。
  • Fortran:支持多种 Fortran 标准。
  • Java:GCC 曾包含对 Java 的支持,但自 GCC 5 版本起已不再包含。
  • Ada:通过 GNU Ada 编译器(GNAT)提供支持。
  • 其他语言:GCC 还支持一些较少使用的编程语言,如 Go、D、等。

主要组件

  • 前端:解析源代码并生成中间表示(Intermediate Representation,IR)。
  • 中间端:优化中间表示。
  • 后端:将优化后的中间表示转换为目标机器的汇编代码。
  • 汇编器:将汇编代码转换为机器代码。
  • 链接器:将多个目标文件和库链接成最终的可执行文件。

特点

  • 跨平台:GCC 可以在多种操作系统和硬件架构上编译源代码,生成适用于不同平台的可执行文件。
  • 优化:提供多种优化选项,帮助开发者生成高效的代码。
  • 调试支持:生成调试信息,与 GDB(GNU Debugger)等调试工具兼容。
  • 标准遵循:遵循各种编程语言的国际标准,确保代码的可移植性和兼容性。
  • 扩展性:GCC 的设计允许添加对新语言和新特性的支持。

使用场景

  • 操作系统开发:许多操作系统,包括 Linux,使用 GCC 进行系统和应用程序的开发。
  • 嵌入式系统:GCC 提供了对多种嵌入式处理器的支持,广泛用于嵌入式开发。
  • 学术研究:GCC 的灵活性和可扩展性使其成为学术研究中常用的编译器。
  • 工业应用:许多商业软件也使用 GCC 进行编译,因为它是免费且功能强大的工具。

发展历史

  • GCC 最初由 Richard Stallman 在 1987 年开始开发。
  • 随着时间的推移,GCC 不断扩展,支持更多的编程语言和平台。
  • GCC 是 GNU 项目中最重要的组成部分之一,也是自由软件运动的象征。

GCC 不断更新和改进,以适应不断变化的编程语言标准和硬件技术。它在软件开发领域中扮演着不可或缺的角色。

g++与gcc

g++ 和 gcc 都是 GNU 编译器集合(GNU Compiler Collection,简称 GCC)的一部分,它们用于编译不同的编程语言源代码。GCC 是一个开源项目,支持多种编程语言,包括但不限于 C、C++、Objective-C、Fortran、Java 和 Ada。
g++ 是 GNU 编译器集合中的 C++ 编译器,而 gcc 是 GNU 编译器集合中的 C 编译器。它们都是 GNU 编译器集合(GNU Compiler Collection)的一部分,通常用于编译 C 和 C++ 程序。

  1. gcc(GNU C Compiler)
    • 用途:用于编译 C 语言源代码。
    • 特点:
      • 支持 ISO C 标准和 GNU C 扩展。
      • 提供了多种编译选项来优化代码和生成调试信息。
      • 可以生成可执行文件或编译成汇编代码。
  2. g++(GNU C++ Compiler)
    • 用途:用于编译 C++ 语言源代码。
    • 特点:
      • 支持 ISO C++ 标准和 GNU C++ 扩展。
      • 除了 C++ 特有的特性外,也支持 C 语言的特性。
      • 支持模板、异常处理、运行时类型识别等 C++ 特性。
      • 可以与 g++ 一起使用 C++ 标准库,例如 STL(Standard Template Library)。

编译过程

编译过程通常包括以下几个步骤:

  • 预处理:处理源代码中的宏定义、条件编译指令等。
  • 编译:将预处理后的代码转换成汇编代码。
  • 汇编:将汇编代码转换成机器代码。
  • 链接:将多个目标文件和库文件链接成一个可执行文件。

编译选项示例

  • -o < filename > :指定输出的可执行文件名。
  • -g:生成调试信息,方便使用调试器。
  • -Wall:打开所有警告信息,帮助开发者发现潜在问题。
  • -O2:优化代码,提高程序运行效率,但可能增加编译时间。
  • -std=c++11:指定使用 C++11 标准进行编译。

注意事项

  • g++ 可以编译 C 语言代码,但通常使用 gcc 来编译 C 语言源代码,以避免混淆。
  • 某些情况下,g++ 可能默认使用较新的 C++ 标准,而 gcc 可能默认使用较新的 C 标准。
  • 编译器的版本和选项可能会影响编译结果和性能。

g++ 编译可执行程序过程

  1. c++程序:main.cpp
#include <iostream>
using namespace std;int add (int a, int b)
{return a+b;
}int main()
{int x = 30;int y = 100;int ret = add(x, y);cout << "sum: " << ret << endl;return 0;
}
  1. 终端输入编译 g++编译命令g++ -o add main.cpp
  2. 运行生成的可执行程序./add
  3. 查看结果sum: 130
  4. 编译选项
    • -Wall:打开几乎所有的警告信息。
      - -std=c++14:指定使用C++14标准(你可以根据自己的需求选择其他标准,如c++11、c++17等)。
    • -O2:优化编译,提高程序运行效率。
  5. g++优化编译命令g++ -Wall -std=c++14 -O2 -o add main.cpp
  6. 可以看到程序运行更快了。

g++ 编译动态库并链接到可执行程序过程

  1. c++ 程序add.cppadd.hppmain.cpp
  • add.hpp
int add(int a, int b);
  • add.cpp
#include "add.hpp"int add(int a, int b)
{return a+b;
}
  • main.cpp
#include <iostream>
#include "add.hpp"using namespace std;int main()
{int x = 30;int y = 100;int ret = add(x, y);cout << "sum: " << ret << endl;return 0;
}
  1. 编译动态库的目标文件 add.og++ -c -fPIC -Wall -std=c++14 -O2 -o add.o add.cpp
  2. 编译动态库 add.ag++ -shared -o add.a add.o
  3. 编译可执行程序目标文件 main.og++ -c -Wall -std=c++14 -O2 -o main.o main.cpp
  4. 链接动态库编译成可执行程序g++ -o main main.o -L. add.a
  5. 运行生成的可执行程序./main
  6. 查看结果sum: 130

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硅纪元视角 | AI纳米机器人突破癌症治疗,精准打击肿瘤细胞

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

Ubuntu24.04之安装KVM(二百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域&#xff0c;随着技术的飞速发展和智能设备的普及&#xff0c;将先进的计算机视觉技术集成到移动平台&#xff0c;特别是Android系统中&#xff0c;已成为提升用户体验、拓展应用功能的关键。其中&#xff0c;目标检测与人脸识别作为计算机视…

mindspore打开第十四天文本解码原理1

## __文本解码原理\-\-以MindNLP为例__ ### 回顾&#xff1a;自回归语言模型 __根据前文预测下一个单词__ <div aligncenter><img src"https://openi.pcl.ac.cn/mindspore-courses/Step_into_LLMs/raw/commit/8f6e55c907ef7d2b616e8e3c4da76b065633c2ae/Season…

vue3 hooks el-table封装 (未使用ts版本)

基于elementuiPlus el-table 表格 import { ref, reactive, onMounted } from vue import { ElMessage, ElMessageBox, ElNotification } from element-plus /*** FileDescription: el-table 函数式组件hooks,* function:useTable(config)* param {object} config useTable(配置…

Linux—文件内系统与日志分析

目录 一、Linux文件系统 1、inode 与 block概述 1.2、inode内容 1.3、查找inode 1.4、inode故障处理 2、硬盘分区后的结构 3、访问文件的流程 4、文件恢复 4.1、恢复ext3格式文件 4.2、恢复 xfs 格式文件 二、Linux日志文件 1、日志的功能 2、日志的默认位置 3、日…

Turborepo简易教程

参考官网&#xff1a;https://turbo.build/repo/docs 开始 安装全新的项目 pnpm dlx create-turbolatest测试应用包含&#xff1a; 两个可部署的应用三个共享库 运行&#xff1a; pnpm install pnpm dev会启动两个应用web(http://localhost:3000/)、docs(http://localhost…

什么开放式耳机好用?五大王牌开放式耳机种草!

随着科技的持续进步&#xff0c;开放式蓝牙耳机悄然兴起&#xff0c;逐步取代了经典的入耳式耳机。入耳式耳机以其卓越的隔音性能著称&#xff0c;然而&#xff0c;长时间的使用却容易引发耳道受压&#xff0c;伴随而来的不仅是疼痛与不适&#xff0c;更潜藏着耳膜受损的风险。…

JavaScript(5)——数据类型和类型检测

字符串类型String 通过单引号&#xff08; &#xff09;、双引号(" "&#xff09;或反引号&#xff08; &#xff09;都叫字符串&#xff0c;单引号和双引号本质上没有区别&#xff0c;一般使用单引号。 注意&#xff1a; 无论单引号或是双引号必须成对使用单引号和…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大&#xff0c;导致训练效果很差。在图像生成任务中并不明显&#xff0c;但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

打印机删除副本以后无法安装打印机驱动

根据知乎文章解决打印机驱动副本存在多个&#xff0c;打印机驱动无法删除&#xff0c;或者驱动包无法删除等问题。的方法删除打印机副本以后发现无论如何也装不上驱动了。 要么驱动安装成功&#xff0c;但是设备仍然是指定状态。 后面发现是删错文件夹了&#xff0c;教程里让删…

顶级5款有用的免费IntelliJ插件,提升你作为Java开发者的旅程

在本文中&#xff0c;我们将深入探讨IntelliJ IDEA插件——那些可以提升你生产力的神奇附加组件&#xff0c;并微调你的代码以达到卓越。我们将探索5款免费插件&#xff0c;旨在将你的开发水平提升到一个新的高度。 1. Test Data 使用Test Data插件进行上下文操作 作为开发者&a…

一分钟学会内六角螺丝外观快速检测!

内六角螺丝是一种螺丝&#xff0c;其螺纹头部设计为六角形凹槽&#xff0c;用于接受内六角扳手或扭力扳手等工具&#xff0c;以便安装和拆卸。使得内六角螺丝在密闭空间或需要较高扭矩的情况下更容易使用&#xff0c;因为内六角工具可以提供更好的操控和扭矩传递效率。内六角螺…

使用 iconfont.ttf文件保存多个图标文件,并且像文字一样使用代码绘制出来

先看演示效果 这里的多个图标其实是存储在 iconfont.ttf文件中 这个文件里面的图标对应的编码 显示代码 void CMFCApplication3Dlg::OnBnClickedOk() {// 加载字体文件CString fontPath = _T("C:\\Users\\35497\\Desktop\\test\\MFCApplication3\\font\\iconfont.ttf&qu…

海外短剧CPS推广分佣系统平台讲解,他和短剧播放平台有啥区别?

首先来讲讲什么是海外短剧系统&#xff1f;什么是海外短剧cps系统&#xff1f;这俩有何区别&#xff1f; 海外短剧系统 顾名思义&#xff1a;就是做一套海外短剧系统&#xff0c;把剧放在自己的系统内&#xff0c;让用户来充值&#xff0c;充值的钱全部都是我自己的&#xff…

css美化滚动条样式

效果展示 实现 滚动条宽&#xff0c;高度 /* 整体滚动条 */ ::-webkit-scrollbar {width: 10px; }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background-color: #ffffff;border-radius: 6px; }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background-color: #888;borde…

JSON字符串中获取一个指定字段的值

一、方式一&#xff0c;引用gson工具 测试报文&#xff1a; {"account":"yanxiaosheng","password":"123456" } 引入pom <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency><gr…

stm8玩耍日记1

写在前面&#xff0c;如题所示&#xff0c;这是一个stm8L051F3的玩耍记录。 环境使用的是IAR for stm8&#xff0c;使用stlink v2作为调试下载器&#xff0c;跟着st中文论坛的一个大佬的教程学习的。 整体配置下来&#xff0c;点亮了led&#xff0c;感觉和stm32的开发差不多&…

豆包Marscode体验官,体验云编程和AI助手加持的快乐

我正在参加「豆包MarsCode初体验」征文活动&#xff0c;活动链接&#xff1a;https://juejin.cn/post/7384997062416252939?utm_sourcejuejin&utm_mediumpush&utm_campaigntiyanguan Marscode官网地址&#xff1a;工作台 - MarsCode 其实早在前不久&#xff0c;我就…