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.mfbz.cn/a/773114.html

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

相关文章

【Android源码】Gerrit安装

前言 如果你打开 https://android.googlesource.com/platform/manifest&#xff0c;就会发现&#xff0c;google官方管理Android源码&#xff0c;使用的是Gerrit。Android系统源码是非常大的&#xff0c;用Git肯定是不适合。对于大型项目&#xff0c;得用Gerrit&#xff0c;今…

背包问题(一)

一.P3985 不开心的金明(01背包变式) 解析: 一开始没有看数据范围,直接当01背包直接写了,结果最后4个测试点RE,一看到数据范围就老实了,1e9的数据,数组直接炸,所以不能直接使用一维的01背包.看了一下题解,部分人是通过极差对数据进行分类,按照300进行分开,使用贪心和dp一起做. …

7_1_SVPWM概述

1、SPWM 正弦脉宽调制法&#xff08;SPWM&#xff09;是将每一正弦周期内的多个脉冲作自然或规则的宽度调制&#xff0c;使其依次调制出相当于正弦函数值的相位角和面积等效于正弦波的脉冲序列&#xff0c;形成等幅不等宽的正弦化电流输出。 通过调整占空比使等效电流近似为正弦…

DT浏览器很好用

DT浏览器是一款简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;软件使用流畅。DT浏览器的网址收藏&#xff0c;人工智能写作&#xff0c;书法笔记等功能与众不同。DT浏览器的图文识别功能和笔记本搭配使用&#xff0c;可以对内容编辑修改和保存…

时序模型综述论文

时序模型综述论文&#xff1a; A Survey of Time Series Foundation Models: Generalizing Time Series Representation with Large Language Model

c++ String

1.string类 还记得我们数据结构学的串吗&#xff0c;现在在c中&#xff0c;我们有了c提供的标准库&#xff0c;它是一个写好的类&#xff0c;非常方便使用 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作strin…

学习笔记——动态路由——OSPF工作原理(SPF算法)

3、SPF算法 SPF算法(最短路径优先算法&#xff0c;也称Dijkstra算法)由荷兰科学家狄克斯特拉于1959年提出的。 SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离&#xff0c;每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图&#xff0c;该…

MySQL:MySQL总结

文章目录 MySQL思维导图基础实际在 Innodb 存储引擎中&#xff0c;会用一个特殊的记录来标识最后一条记录&#xff0c;该特殊的记录的名字叫 supremum pseudo-record &#xff0c;所以扫描第二行的时候&#xff0c;也就扫描到了这个特殊记录的时候&#xff0c;会对该主键索引加…

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统&#xff0c;后台管理页面兼容所有主流浏览器&#xff0c;完全响应式布局&#xff08;支持电脑、平板、手机等所有主流设备&#xff09;&#xff0c;可切换至 Blazor 多 Tabs 模式&#xff0c;…

JVM原理(十六):JVM虚拟机类型擦除与泛型发展

1. 泛型 泛型的本质是参数化类型或者参数化多态的应用&#xff0c;即可以将操作的数据类型指定为方法签名中的一种特殊参数&#xff0c;这种参数类型能够用在类、接口和方法的创建中&#xff0c;分别构成泛型类、泛型接口和泛型方法。 泛型让程序员能够以针对泛化的数据类型编…

手动访问mongo和ES插入和查询

1、手动访问mongo 1.1、mongo连接数据库 1.2、mongo插入和查询 db.hmf_test.insert( { "aoeId": "1", "aoeAes": "吴秀梅", "aoeSm4": "北京xx网络技术有限公司.", "aoeSm4_a": "…

【BUUCTF-PWN】4-ciscn_2019_n_1

参考&#xff1a;BUUCTF-ciscn_2019_n_1 - 纸鸢asahi - 博客园 (cnblogs.com) buuctf 刷题记录_PWN ciscn_2019_n_1 - MuRKuo - 博客园 (cnblogs.com) 从题海中入门&#xff08;四&#xff09;ciscn_2019_n_1 - FreeBuf网络安全行业门户 ciscn_2019_n_1 ——两种解法_0x4134800…

抗震支吊架安装

抗震支吊架系统安装指导 设计要求&#xff1a; 本工程采用抗震支吊架系统&#xff0c;请根据深化设计提供的图纸及安装材料表等进行安装。 材料要求&#xff1a; 符合 CJ/T476-2015《建筑机电设备抗震支吊架通用技术条件》及 CECS 420:2015《抗震支吊架安装及验收规程》 槽…

Go语言--延迟调用defer、获取命令行参数、局部变量以及全局变量

延迟调用defer 关键字 defer 用于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行。注意&#xff0c;defer语句只能出现在函数或方法的内部。 defer 语句经常被用于处理成对的操作&#xff0c;如打开、关闭、连接、断开连接、加锁、释放锁。通过defer 机制&#xff0…

生态共建 | 华宇TAS应用中间件与新华三服务器完成兼容互认证

近日&#xff0c;华宇TAS应用中间件完成与新华三技术有限公司的R4930系列和R4970 G7服务器的兼容适配&#xff0c;认证测试报告显示&#xff0c;双方产品兼容性良好&#xff0c;运行稳定、安全&#xff0c;可以满足用户对双方功能的要求。 新华三技术有限公司 新华三技术有限公…

Pandas数据清洗实战:精准捕捉并优雅过滤异常值,让数据分析更可靠!

1.describe()&#xff1a;查看每一列的描述性统计量 # 导包 import numpy as np import pandas as pddf pd.DataFrame(datanp.random.randint(0,10,size(5,3)),indexlist("ABCDE"),columns["Python","NumPy","Pandas"]) dfdf.descri…

SQL MINUS 运算符:查找数据集之间的差异

在 SQL 中&#xff0c;MINUS 运算符在查询中起着至关重要的作用&#xff0c;它允许开发人员识别和检索存在于一个数据集中但不存在于另一个数据集中的记录。本文探讨了 SQL 中 MINUS 运算符的功能、用法和实际应用&#xff0c;强调了它在数据分析和操作任务中的重要性。 理解 …

adobe pdf设置默认打开是滚动而不是单页视图

上班公司用adobe pdf&#xff0c;自己还不能安装其它软件。 每次打开pdf&#xff0c;总是默认单页视图&#xff0c;修改滚动后&#xff0c;下次打开又 一样&#xff0c;有时候比较烦。 后面打开编辑->首选项&#xff0c; 如下修改&#xff0c;下次打开就是默认滚动了

开源六轴协作机械臂myCobot280实现交互式乘法!让学习充满乐趣

本文经作者Fumitaka Kimizuka 授权我们翻译和转载。 原文链接&#xff1a;myCobotに「頷き」「首振り」「首傾げ」をしてもらう &#x1f916; - みかづきブログ・カスタム 引言 Fumitaka Kimizuka 创造了一个乘法表系统&#xff0c;帮助他的女儿享受学习乘法表的乐趣。她可以…

FPGA问题

fpga 问题 ep2c5t144 开发板 第一道坎&#xff0c;安装软件&#xff1b;没有注册&#xff0c;无法产生sop文件&#xff0c;无法下载 没有相应的库的quartus ii版本&#xff0c;需要另下载 第二道坎&#xff0c;模拟器的下载&#xff0c;安装&#xff1b; 第三道&#xff0c;v…