当前位置: 首页 > news >正文

GCC 和 G++的基本使用

GCC 和 G++ 命令

  • GCC 和 G++ 命令
    • GCC(GNU C 编译器)
      • 基本用法
      • 常用选项
      • 示例
    • G++(GNU C++ 编译器)
      • 基本用法
      • 常用选项
      • 示例
    • GCC 与 G++ 的区别
      • 选择使用 GCC 还是 G++
  • C++编译流程
    • 1. 预处理(Preprocessing)
    • 2. 编译(Compilation)
    • 3. 汇编(Assembly)
    • 4. 链接(Linking)
    • 综合示例
  • 头文件搜索路径
    • 1. 引号包含的头文件 (`"add.h"`)
      • 搜索路径
    • 示例
    • 2. 尖括号包含的头文件 (`<add.h>`)
      • 搜索路径
      • 使用场景
    • 示例
        • 编译命令示例
    • 3. 区别总结

GCC 和 G++ 命令

GCC(GNU Compiler Collection)和 G++ 是 GNU 项目中用于编译 C 和 C++ 代码的工具。以下是它们的基本用法和相关命令,输出参数统一放在最后。

GCC(GNU C 编译器)

基本用法

gcc [选项] 输入文件 [输出文件]

常用选项

  • -c:仅编译源文件,生成目标文件(.o 文件),不进行链接。
  • -E:仅进行预处理,输出预处理后的文件。
  • -S:编译源文件并生成汇编代码。
  • -Wall:启用所有常见警告。
  • -O<level>:优化级别(如 -O2-O3)。
  • -I<目录>:添加头文件搜索路径。
  • -L<目录>:添加库文件搜索路径。
  • -l<库名>:链接指定的库(如 -lm 链接数学库)。

示例

  1. 编译单个 C 文件并生成可执行文件

    gcc hello.c -o hello
    
  2. 编译多个 C 文件并生成可执行文件

    gcc main.c utils.c -Wall -o myprogram
    
  3. 仅编译源文件生成目标文件

    gcc -c utils.c -o utils.o
    
  4. 编译并链接生成可执行文件,启用优化

    gcc -O2 main.c utils.c -o optimized_program
    
  5. 包含头文件和库文件的编译

    gcc -I/path/to/includes -L/path/to/libs main.c -lmylib -o myapp
    

G++(GNU C++ 编译器)

G++ 是 GCC 的一部分,专门用于编译 C++ 代码。其用法与 GCC 类似,但默认处理 C++ 代码,输出参数同样放在最后。
![[Pasted image 20250221101414.png]]

基本用法

g++ [选项] 输入文件 [输出文件]

常用选项

  • -c:仅编译源文件,生成目标文件(.o 文件),不进行链接。
  • -E:仅进行预处理,输出预处理后的文件。
  • -S:编译源文件并生成汇编代码。
  • -Wall:启用所有常见警告。
  • -O<level>:优化级别(如 -O2-O3)。
  • -std=<标准>:指定 C++ 标准(如 -std=c++17)。
  • -I<目录>:添加头文件搜索路径。
  • -L<目录>:添加库文件搜索路径。
  • -l<库名>:链接指定的库(如 -lm 链接数学库)。

示例

  1. 编译单个 C++ 文件并生成可执行文件

    g++ hello.cpp -o hello_cpp
    
  2. 编译多个 C++ 文件并生成可执行文件

    g++ main.cpp utils.cpp -Wall -o mycppapp
    
  3. 仅编译源文件生成目标文件

    g++ -c utils.cpp -o utils.o
    
  4. 编译并链接生成可执行文件,启用优化并指定 C++ 标准

    g++ -O2 -std=c++17 main.cpp utils.cpp -o optimized_cppapp
    
  5. 包含头文件和库文件的编译

g++ -I/path/to/includes -L/path/to/libs main.cpp -lmycpplib -o mycppapp

GCC 与 G++ 的区别

特性GCC(GNU C 编译器)G++(GNU C++ 编译器)
主要用途编译 C 语言代码编译 C++ 语言代码
默认链接库链接 C 标准库链接 C++ 标准库(包括 STL 等)
支持的编程语言主要支持 C,通过子命令支持其他语言(如 g++ 支持 C++)专门支持 C++
使用场景适用于纯 C 项目或需要混合编译多种语言的项目适用于纯 C++ 项目或需要使用 C++ 特性的项目
编译选项大部分选项与 G++ 共享,但某些 C++ 特有的选项仅适用于 G++包含所有 GCC 选项,并增加了一些 C++ 特有的选项,如 -std=c++17

选择使用 GCC 还是 G++

  • 使用 GCC

    • 当你只需要编译 C 代码时。
    • 在需要混合编译 C 和其他语言(如 Fortran、Objective-C)的项目中。
  • 使用 G++

    • 当你需要编译 C++ 代码时,尤其是涉及面向对象编程、模板、异常处理等 C++ 特性时。
    • 在开发纯 C++ 项目或需要链接 C++ 标准库的项目中。

C++ 代码的编译过程通常分为四个主要阶段:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)。每个阶段都有特定的任务,最终将源代码转换为可执行文件。以下是详细的编译过程说明:


C++编译流程

1. 预处理(Preprocessing)

任务:处理源代码中的预处理指令,如 #include#define#ifdef 等。

主要操作

  • 包含头文件:将 #include 指令替换为对应头文件的内容。
  • 宏替换:展开 #define 定义的宏。
  • 条件编译:根据预处理指令决定哪些代码块需要保留或剔除。
  • 错误处理:检测预处理指令中的语法错误。

工具:预处理器(如 cpp),在GCC/G++中,预处理器是编译过程的一部分。

示例命令

g++ -E main.cpp -o main.i

这条命令会将 main.cpp 进行预处理,并将结果输出到 main.i 文件中。

示例
预处理后的 main.i 文件将包含 <iostream> 的内容,并将 PI 替换为 3.14159


2. 编译(Compilation)

任务:将预处理后的源代码翻译成汇编语言代码。

工具:编译器前端(如 clanggcc 的前端)

示例命令

g++ -S main.i -o main.s

这条命令会将预处理后的文件 main.i 编译成汇编代码,并将结果输出到 main.s 文件中。

示例
生成的汇编代码可能如下所示:

section .datamsg db 'Pi is 3.14159',0xAsection .textglobal _start_start:; write syscallmov eax, 1mov ebx, 1mov ecx, msgmov edx, 14int 0x80; exit syscallmov eax, 60xor edi, edisyscall

3. 汇编(Assembly)

任务:将汇编语言代码转换为目标机器的机器码,生成目标文件(Object File)。

主要操作

  • 汇编指令转换:将汇编指令转换为二进制机器码。
  • 生成符号表:记录变量、函数等的地址信息。

工具:汇编器(如 asnasm),在GCC/G++中,汇编器是编译过程的一部分。

示例命令

g++ -c main.s -o main.o

这条命令会将汇编代码 main.s 转换为目标文件 main.o

示例
生成的 main.o 文件包含机器码和符号表。


4. 链接(Linking)

任务:将一个或多个目标文件与所需的库文件链接,生成最终的可执行文件。

主要操作

  • 符号解析:解析目标文件中的未定义符号,找到其在其他目标文件或库中的定义。
  • 重定位:调整目标文件中的地址引用,使其指向正确的位置。
  • 生成可执行文件:组合所有必要的代码和数据,生成可执行文件。

工具:链接器(如 ldgold),在GCC/G++中,链接器是编译过程的一部分。

示例命令

g++ main.o -o myprogram

这条命令会将目标文件 main.o 链接成最终的可执行文件 myprogram

多文件示例
假设有两个源文件 main.cpputils.cpp,可以按以下步骤编译和链接:

  1. 预处理:

    g++ -E main.cpp -o main.i
    g++ -E utils.cpp -o utils.i
    
  2. 编译:

    g++ -S main.i -o main.s
    g++ -S utils.i -o utils.s
    
  3. 汇编:

    g++ -c main.s -o main.o
    g++ -c utils.s -o utils.o
    
  4. 链接:

    g++ main.o utils.o -o myprogram
    

或者,使用单个命令完成所有步骤:

g++ main.cpp utils.cpp -o myprogram

综合示例

假设有以下 C++ 代码:

// main.cpp
#include <iostream>int add(int a, int b);int main() {int sum = add(3, 4);std::cout << "Sum: " << sum << std::endl;return 0;
}// utils.cpp
int add(int a, int b) {return a + b;
}

编译步骤

  1. 预处理

    g++ -E main.cpp -o main.i
    g++ -E utils.cpp -o utils.i
    
  2. 编译

    g++ -S main.i -o main.s
    g++ -S utils.i -o utils.s
    
  3. 汇编

    g++ -c main.s -o main.o
    g++ -c utils.s -o utils.o
    
  4. 链接

    g++ main.o utils.o -o myprogram
    

最终生成的 myprogram 可执行文件可以运行,输出:

Sum: 7

头文件搜索路径

1. 引号包含的头文件 ("add.h")

搜索路径

  • 当前目录:首先在包含该头文件的源文件所在的当前目录中查找。
  • 用户指定的目录:如果在编译时使用了 -I 选项指定了额外的包含路径,编译器会在这些路径中查找。
  • 标准包含路径:最后,编译器会在系统的标准包含路径中查找。

示例

假设有以下目录结构:

project/
├── src/
│   ├── main.cpp
│   └── add.h
└── include/└── utils.h

main.cpp 中包含 add.h

#include "add.h"

编译时,编译器会首先在 src/ 目录下查找 add.h


2. 尖括号包含的头文件 (<add.h>)

在C和C++编程中,包含头文件时使用引号 ("add.h") 和尖括号 (<add.h>) 会影响编译器搜索头文件的路径。这两者的主要区别在于编译器查找头文件的位置和优先级。以下是详细的解释:

搜索路径

  • 标准系统目录:编译器会在预定义的标准系统包含路径中查找,这些路径通常由编译器的安装配置决定。
  • 环境变量指定的目录:某些情况下,环境变量(如 CPLUS_INCLUDE_PATH)也可以影响搜索路径。

使用场景

  • 标准库头文件:用于包含C++标准库或其他第三方库的头文件。
  • 全局头文件:适用于那些位于系统范围内的头文件,不需要用户额外指定路径。

示例

假设 add.h 位于系统的标准包含路径中:

#include <add.h>

编译器会在其标准包含路径中查找 add.h,而不会考虑当前源文件所在的目录。可以使用 -I 选项指定包含路径(假设在src路径下,命令如下)。

编译命令示例

bash

g++ -I. main.cpp -o myprogram

3. 区别总结

特性"add.h"<add.h>
搜索优先级当前目录 → 用户指定目录 → 标准包含路径标准包含路径
使用场景项目内部头文件、相对路径引用标准库头文件、第三方库头文件
灵活性更灵活,适用于需要引用本地或相对路径的头文件不灵活,适用于全局或系统范围内的头文件
示例#include "mylib.h"#include <vector>

相关文章:

GCC 和 G++的基本使用

GCC 和 G 命令 GCC 和 G 命令GCC&#xff08;GNU C 编译器&#xff09;基本用法常用选项示例 G&#xff08;GNU C 编译器&#xff09;基本用法常用选项示例 GCC 与 G 的区别选择使用 GCC 还是 G C编译流程1. 预处理&#xff08;Preprocessing&#xff09;2. 编译&#xff08;Co…...

Maven中一些基础知识点

早些时候只知道创建或者开发springboot项目时候&#xff0c;有一个叫pom.xml的文件可以用来管理项目所需的依赖/第三方工具。 索性稍微深入了解了一下&#xff0c;然后把自己认为重要的记录下来。 首先我们要引入新的依赖自然是在dependencies下写dependency&#xff0c;这个…...

论文阅读笔记:Deep Face Recognition: A Survey

论文阅读笔记&#xff1a;Deep Face Recognition: A Survey 1 介绍2 总览2.1 人脸识别组件2.1.1 人脸处理2.1.2 深度特征提取2.1.3 基于深度特征的人脸对比 3 网络结构和损失函数3.1 判别损失函数的演化3.1.1 基于欧式距离的损失3.1.2 基于角度/余弦边距的损失3.1.3 Softmax损失…...

JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能

提到飞行记录器&#xff0c;或许你的脑海中并未立刻浮现出清晰的画面&#xff0c;但一说起“黑匣子”&#xff0c;想必大多数人都能恍然大悟&#xff0c;知晓其重要性及用途。在航空领域&#xff0c;黑匣子作为不可或缺的设备&#xff0c;默默记录着飞行过程中的每一项关键数据…...

爬虫框架与库

爬虫框架与库是用于网络数据抓取的核心工具&#xff0c;帮助开发者高效地从网页中提取结构化数据。 Requests&#xff1a;用于发送HTTP请求。 BeautifulSoup&#xff1a;用于解析HTML和XML。 Scrapy&#xff1a;强大的爬虫框架&#xff0c;适合大规模爬取。 Selenium&#…...

PyTorch常用函数总结(持续更新)

本文主要记录自己在用 PyTorch复现经典模型 过程中遇到的一些函数及用法&#xff0c;以期对 常见PyTorch函数 更加熟练~ 官方Docs&#xff1a;PyTorch documentation — PyTorch 2.6 documentation 目录 数据层面 torch.sign(tensor) torch.tensor(np.eye(3)[y]) torch.on…...

代码异常(js中push)NO.4

1. 环境 Vue3&#xff0c;Element Plsu 2. 示例代码 const { updateBy, updateTime, ...curObj } form.valuecurObj.id props.tableData.length 1var newTableData props.tableData.push(curObj)updateTableData(newTableData)3. 情景描述 newTableData变成了整数&#…...

Anaconda 2025 最新版安装与Python环境配置指南(附官方下载链接)

一、软件定位与核心功能 Anaconda 2025 是Python/R数据科学集成开发平台&#xff0c;预装1500科学计算库&#xff0c;新增AI模型可视化调试、多环境GPU加速等特性。相较于传统Python安装&#xff0c;其优势包括&#xff1a; 环境隔离&#xff1a;通过conda工具实现多版本Pyth…...

Vue 中动态实现进度条

在 Vue 中动态实现进度条&#xff0c;基本上有两种常见的方法&#xff1a;直接通过 Vue 数据绑定控制样式&#xff0c;或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式&#xff0c;并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...

CSS滚动条原理与自定义样式指南,CSS滚动条样式失效,滚动条样式无效,-webkit-scrollbar无效,overflow不显示滚动条

滚动内容形成的必要条件 CSS Overflow属性解析 MDN官方文档-Overflow属性 菜鸟教程-Overflow属性 overflow 属性控制内容溢出元素框时在对应的元素区间内是否添加滚动条。 值描述visible默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。hidden内容会被修剪&#xf…...

Three.js 入门(辅助、位移、父子关系、缩放旋转、响应式布局)

本篇主要学习内容 : 三维坐标系与辅助坐标系物体位移与父子元素物体的缩放与物体的旋转设置响应式画布与全屏控制 点赞 关注 收藏 学会了 本文使用 Three.js 的版本&#xff1a;171 基于 Vue3vite开发调试 1.三维坐标系与辅助坐标系 1.1) 导入three和轨道控制器 // 导入…...

python算法-用递归打印数字3的幂--Day017

文章目录 前言采用创新方式&#xff0c;精选趣味、实用性强的例子&#xff0c;从不同难度、不同算法、不同类型和不同数据结构进行总结&#xff0c;全面提升算法能力。例1.用递归打印数字例2.相对排名 总结 前言 采用创新方式&#xff0c;精选趣味、实用性强的例子&#xff0c…...

Selenium 与 Coze 集成

涵盖两者的基本概念、集成步骤、代码示例以及相关注意事项。 基本概念 Selenium:是一个用于自动化浏览器操作的工具集,支持多种浏览器(如 Chrome、Firefox 等),能够模拟用户在浏览器中的各种操作,如点击、输入文本、选择下拉框等,常用于 Web 应用的自动化测试。Coze:它…...

AWS CLI将读取器实例添加到Amazon Aurora集群

Amazon Aurora是AWS提供的一种兼容MySQL和PostgreSQL的关系数据库服务。Aurora集群由一个写入器实例和多个读取器实例组成,可以提供高可用性、高性能和可扩展性。在本文中,我们将介绍如何使用AWS命令行界面(CLI)将读取器实例添加到现有的Aurora集群中。 © ivwdcwso (ID: u…...

NTS库学习,找bug中......

基础知识 Coordinate: 表示一个二维坐标点&#xff0c;包括 X 和 Y 坐标值。 CoordinateSequence: 由一系列 Coordinate 对象组成的序列&#xff0c;可以表示线、多边形等几何对象的顶点。 CoordinateFilter: 用于对几何对象的坐标进行过滤或修改的接口。 Geometry: 表示一个几…...

五十天精通硬件设计第40天-硬件测试流程

目录 一、硬件测试流程概述 二、详细测试流程 1. 需求分析与测试计划 2. 测试环境搭建 3. 测试执行 3.1 基本功能测试 3.2 性能测试 3.3 环境与可靠性测试 3.4 安全与合规性测试 4. 问题分析与调试 5. 回归测试与报告输出 三、关键注意事项 四、常见问题与解决 五…...

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手&#xff0c;还是希望更新知识体系的专业人士&#xff0c;只要按照本…...

数据库 安装initializing database不通过

出现一下情况时&#xff1a; 处理方法&#xff1a; 将自己的电脑名称 中文改成英文 即可通过...

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…...

信号——进程间通信(20250225)

1. 信号 管道&#xff1a;进程间数据通信&#xff08;同步通信&#xff09; 信号&#xff1a;进程间通信,用来发送通知(异步通信&#xff0c;中断) 1&#xff09;同步通信:发送端和接收端&#xff0c;使用同一时钟通信 异步通信:发送端和接收端使用不同时钟通信 …...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...