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
链接数学库)。
示例
-
编译单个 C 文件并生成可执行文件
gcc hello.c -o hello
-
编译多个 C 文件并生成可执行文件
gcc main.c utils.c -Wall -o myprogram
-
仅编译源文件生成目标文件
gcc -c utils.c -o utils.o
-
编译并链接生成可执行文件,启用优化
gcc -O2 main.c utils.c -o optimized_program
-
包含头文件和库文件的编译
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
链接数学库)。
示例
-
编译单个 C++ 文件并生成可执行文件
g++ hello.cpp -o hello_cpp
-
编译多个 C++ 文件并生成可执行文件
g++ main.cpp utils.cpp -Wall -o mycppapp
-
仅编译源文件生成目标文件
g++ -c utils.cpp -o utils.o
-
编译并链接生成可执行文件,启用优化并指定 C++ 标准
g++ -O2 -std=c++17 main.cpp utils.cpp -o optimized_cppapp
-
包含头文件和库文件的编译
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)
任务:将预处理后的源代码翻译成汇编语言代码。
工具:编译器前端(如 clang
、gcc
的前端)
示例命令:
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)。
主要操作:
- 汇编指令转换:将汇编指令转换为二进制机器码。
- 生成符号表:记录变量、函数等的地址信息。
工具:汇编器(如 as
、nasm
),在GCC/G++中,汇编器是编译过程的一部分。
示例命令:
g++ -c main.s -o main.o
这条命令会将汇编代码 main.s
转换为目标文件 main.o
。
示例:
生成的 main.o
文件包含机器码和符号表。
4. 链接(Linking)
任务:将一个或多个目标文件与所需的库文件链接,生成最终的可执行文件。
主要操作:
- 符号解析:解析目标文件中的未定义符号,找到其在其他目标文件或库中的定义。
- 重定位:调整目标文件中的地址引用,使其指向正确的位置。
- 生成可执行文件:组合所有必要的代码和数据,生成可执行文件。
工具:链接器(如 ld
、gold
),在GCC/G++中,链接器是编译过程的一部分。
示例命令:
g++ main.o -o myprogram
这条命令会将目标文件 main.o
链接成最终的可执行文件 myprogram
。
多文件示例:
假设有两个源文件 main.cpp
和 utils.cpp
,可以按以下步骤编译和链接:
-
预处理:
g++ -E main.cpp -o main.i g++ -E utils.cpp -o utils.i
-
编译:
g++ -S main.i -o main.s g++ -S utils.i -o utils.s
-
汇编:
g++ -c main.s -o main.o g++ -c utils.s -o utils.o
-
链接:
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;
}
编译步骤:
-
预处理:
g++ -E main.cpp -o main.i g++ -E utils.cpp -o utils.i
-
编译:
g++ -S main.i -o main.s g++ -S utils.i -o utils.s
-
汇编:
g++ -c main.s -o main.o g++ -c utils.s -o utils.o
-
链接:
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(GNU C 编译器)基本用法常用选项示例 G(GNU C 编译器)基本用法常用选项示例 GCC 与 G 的区别选择使用 GCC 还是 G C编译流程1. 预处理(Preprocessing)2. 编译(Co…...
Maven中一些基础知识点
早些时候只知道创建或者开发springboot项目时候,有一个叫pom.xml的文件可以用来管理项目所需的依赖/第三方工具。 索性稍微深入了解了一下,然后把自己认为重要的记录下来。 首先我们要引入新的依赖自然是在dependencies下写dependency,这个…...

论文阅读笔记:Deep Face Recognition: A Survey
论文阅读笔记: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)的强大功能
提到飞行记录器,或许你的脑海中并未立刻浮现出清晰的画面,但一说起“黑匣子”,想必大多数人都能恍然大悟,知晓其重要性及用途。在航空领域,黑匣子作为不可或缺的设备,默默记录着飞行过程中的每一项关键数据…...
爬虫框架与库
爬虫框架与库是用于网络数据抓取的核心工具,帮助开发者高效地从网页中提取结构化数据。 Requests:用于发送HTTP请求。 BeautifulSoup:用于解析HTML和XML。 Scrapy:强大的爬虫框架,适合大规模爬取。 Selenium&#…...

PyTorch常用函数总结(持续更新)
本文主要记录自己在用 PyTorch复现经典模型 过程中遇到的一些函数及用法,以期对 常见PyTorch函数 更加熟练~ 官方Docs:PyTorch documentation — PyTorch 2.6 documentation 目录 数据层面 torch.sign(tensor) torch.tensor(np.eye(3)[y]) torch.on…...
代码异常(js中push)NO.4
1. 环境 Vue3,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数据科学集成开发平台,预装1500科学计算库,新增AI模型可视化调试、多环境GPU加速等特性。相较于传统Python安装,其优势包括: 环境隔离:通过conda工具实现多版本Pyth…...
Vue 中动态实现进度条
在 Vue 中动态实现进度条,基本上有两种常见的方法:直接通过 Vue 数据绑定控制样式,或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式,并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...
CSS滚动条原理与自定义样式指南,CSS滚动条样式失效,滚动条样式无效,-webkit-scrollbar无效,overflow不显示滚动条
滚动内容形成的必要条件 CSS Overflow属性解析 MDN官方文档-Overflow属性 菜鸟教程-Overflow属性 overflow 属性控制内容溢出元素框时在对应的元素区间内是否添加滚动条。 值描述visible默认值。内容不会被修剪,会呈现在元素框之外。hidden内容会被修剪…...
Three.js 入门(辅助、位移、父子关系、缩放旋转、响应式布局)
本篇主要学习内容 : 三维坐标系与辅助坐标系物体位移与父子元素物体的缩放与物体的旋转设置响应式画布与全屏控制 点赞 关注 收藏 学会了 本文使用 Three.js 的版本:171 基于 Vue3vite开发调试 1.三维坐标系与辅助坐标系 1.1) 导入three和轨道控制器 // 导入…...
python算法-用递归打印数字3的幂--Day017
文章目录 前言采用创新方式,精选趣味、实用性强的例子,从不同难度、不同算法、不同类型和不同数据结构进行总结,全面提升算法能力。例1.用递归打印数字例2.相对排名 总结 前言 采用创新方式,精选趣味、实用性强的例子,…...
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: 表示一个二维坐标点,包括 X 和 Y 坐标值。 CoordinateSequence: 由一系列 Coordinate 对象组成的序列,可以表示线、多边形等几何对象的顶点。 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 的具体步骤。无论你是初涉数据领域的新手,还是希望更新知识体系的专业人士,只要按照本…...

数据库 安装initializing database不通过
出现一下情况时: 处理方法: 将自己的电脑名称 中文改成英文 即可通过...

自动驾驶两个传感器之间的坐标系转换
有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1:先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…...
信号——进程间通信(20250225)
1. 信号 管道:进程间数据通信(同步通信) 信号:进程间通信,用来发送通知(异步通信,中断) 1)同步通信:发送端和接收端,使用同一时钟通信 异步通信:发送端和接收端使用不同时钟通信 …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...