g++和 gcc 编译入门教程

news/2024/7/8 2:19:49 标签: g++, gcc, 编译, GNU, c++, c语言, GCC

GNU_0">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 标准。
  • JavaGCC 曾包含对 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 不断扩展,支持更多的编程语言和平台。
  • GCCGNU 项目中最重要的组成部分之一,也是自由软件运动的象征。

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

GCC.html" title=gcc>gcc_39">g++与GCC.html" title=gcc>gcc

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

  1. GCC.html" title=gcc>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.html" title=gcc>gcc 来编译 C 语言源代码,以避免混淆。
  • 某些情况下,g++ 可能默认使用较新的 C++ 标准,而 GCC.html" title=gcc>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.niftyadmin.cn/n/5536268.html

相关文章

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

Linux--V4L2应用程序开发(二)获取数据

一、采集数据流程 申请buffer用来放置摄像头数据 ioctl VIDIOC_REQBUFS&#xff1a;申请buffer&#xff0c;APP可以申请很多个buffer&#xff0c;但是驱动程序不一定能申请到 ioctl VIDIOC_QUERYBUF和mmap&#xff1a;查询buffer信息、映射 如果申请到了N个buffer&#xff0c…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

table = collections.defaultdict(list)申请的字典的类型是什么?

当你使用 collections.defaultdict(list) 来申请一个字典时&#xff0c;这个字典的类型是 defaultdict&#xff0c;但是其行为和表现方式在某些方面与普通的字典&#xff08;dict&#xff09;相似&#xff0c;主要区别在于它如何处理缺失的键。 defaultdict 是 Python 标准库 …

人工智能系列-numpy(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Numpy是python语言的一个拓展程序库&#xff0c;支持大量的维度数组与矩阵计算&#xff0c;此外也针对数组运算提供大量的数学函数库 NumPy支持的数据类型比Python内置的类型要…

金融科技在反洗钱领域的创新应用及案例

随着金融科技的迅猛发展&#xff0c;其在反洗钱领域的应用也日益广泛和深入。这些创新应用不仅提高了反洗钱工作的效率和准确性&#xff0c;还为金融机构应对日益复杂的洗钱活动提供了有力支持。下面将详细介绍一些金融科技在反洗钱领域的创新应用案例。 一、AI大模型与知识图谱…

同步时钟:北斗/GPS卫星、电信基站、NTP以太网校时方式的区别

同步时钟是保证各设备时间统一的重要装置&#xff0c;广泛应用于电力、通信、金融、学校、医院、地铁等多个领域。目前&#xff0c;常用的同步时钟方式包括&#xff1a;北斗/GPS卫星、电信基站、NTP以太网等。 下面跟着小编来看一下这些校时方式及他们的区别吧。 1. 北斗/GP…

Three.js机器人与星系动态场景(二):强化三维空间认识

在上篇博客中介绍了如何快速利用react搭建three.js平台&#xff0c;并实现3D模型的可视化。本文将在上一篇的基础上强化坐标系的概念。引入AxesHelper辅助工具及文本绘制工具&#xff0c;带你快速理解camer、坐标系、position、可视区域。 Three.js机器人与星系动态场景&#x…