CMake基础:gcc/g++编译选项详解
目录
1.编译步骤
2.gcc 与 g++ 区别
3.gcc 命令的常用选项
3.1.基础编译选项
3.2.优化选项
3.3.调试与分析选项
3.4.链接选项
3.5.语言特性选项(C++ 特化)
3.6.安全增强选项
3.7.架构与指令集优化
3.8.其他常用选项
4.常见编译组合示例
5.常用环境变量
6.注意事项
1.编译步骤
gcc 、 g++分别是gnu的c & c++编译器 。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。
gcc/g++在执行编译工作的时候,总共有4个步骤
1.预处理(Preprocessing)
- 任务:处理
#include
、#define
、#ifdef
等预处理指令。 - 主要操作:
- 展开头文件(如
#include <stdio.h>
)。 - 替换宏定义(如
#define PI 3.14
)。 - 处理条件编译(如
#ifdef DEBUG
)。 - 删除注释。
- 展开头文件(如
- 命令示例:
gcc -E main.c -o main.i # 生成预处理后的文件
2.编译(Compilation)
- 任务:将预处理后的代码转换为汇编代码。
- 主要操作:
- 语法分析:检查代码语法正确性。
- 语义分析:类型检查、作用域解析。
- 代码优化:应用
-O2
、-ftree-vectorize
等优化选项。 - 生成平台相关的汇编代码。
- 命令示例
gcc -c main.s -o main.o # 生成目标文件(二进制)
3.汇编(Assembly)
- 任务:将汇编代码转换为机器码(目标文件)。
- 主要操作:
- 将汇编指令翻译为机器码。
- 生成符号表(记录函数和变量地址)。
- 生成可重定位目标文件(
.o
)。
- 命令示例:
gcc -c main.s -o main.o # 生成目标文件(二进制)
4.链接(Linking)
- 任务:将多个目标文件和库文件合并为可执行文件。
- 主要操作:
- 符号解析:将符号引用(如
printf
)映射到实际地址。 - 重定位:调整代码和数据的地址,使其在运行时正确加载。
- 合并段:将多个目标文件的
.text
、.data
等段合并。 - 链接库:静态链接(复制库代码)或动态链接(运行时加载)。
- 符号解析:将符号引用(如
- 命令示例:
gcc main.o utils.o -o app # 链接多个目标文件
2.gcc 与 g++ 区别
- gcc 是 GCC 编译器的通用编译指令,因为根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别。gcc 指令也为用户提供了“手动指定代表编译方式”的接口,即使用 -x 选项
- xxx.c:默认以编译 C 语言程序的方式编译此文件;
- xxx.cpp:默认以编译 C++ 程序的方式编译此文件。
- xxx.m:默认以编译 Objective-C 程序的方式编译此文件;
- xxx.go:默认以编译 Go 语言程序的方式编译此文件;
- g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。
3.gcc 命令的常用选项
3.1.基础编译选项
选项 | 作用 |
---|---|
-c | 只编译不链接,生成目标文件(.o )。 |
-o <file> | 指定输出文件名(如 -o output )。 |
-E | 仅预处理,不编译、汇编、链接(生成预处理后的代码)。 |
-S | 编译后停止,生成汇编代码(.s )。 |
-Wall | 开启基本警告(建议始终启用)。 |
-Wextra | 开启额外警告(比 -Wall 更严格)。 |
-Werror | 把警告视为错误,强制终止编译。 |
-std=<标准> | 指定语言标准(如 -std=c11 、-std=c++20 )。 |
-I <dir> | 添加头文件搜索路径(如 -I include )。 |
-L <dir> | 添加库文件搜索路径(如 -L lib )。 |
-l<库名> | 链接动态库(如 -lm 链接数学库,-lstdc++ 链接 C++ 标准库)。 |
-static | 静态链接所有库(生成文件体积大,但无需依赖运行时库)。 |
3.2.优化选项
选项 | 作用 |
---|---|
-O0 | 不优化(默认调试模式)。 |
-O1 | 基础优化(减少代码尺寸和执行时间)。 |
-O2 | 中等优化(比 -O1 更激进,不涉及循环展开等风险优化)。 |
-O3 | 最高级别优化(包含 -O2 + 循环展开、函数内联等)。 |
-Os | 优化代码尺寸(适用于嵌入式系统)。 |
-Ofast | 比 -O3 更激进(允许违反语言标准,如忽略 NaN 检查)。 |
-funroll-loops | 手动开启循环展开(需配合 -O2 或更高优化级别)。 |
-finline-functions | 强制内联所有合适的函数。 |
3.3.调试与分析选项
选项 | 作用 |
---|---|
-g | 生成调试信息(支持 gdb 调试,建议与 -O0 搭配)。 |
-gdwarf-4 | 生成 DWARF 4 格式调试信息(更详细的元数据)。 |
-pg | 生成用于 gprof 性能分析的代码。 |
-ftime-report | 显示各编译阶段的耗时统计(如预处理、编译、优化)。 |
-fprofile-generate | 生成性能分析数据(用于反馈优化 PGO)。 |
-fprofile-use | 使用 PGO 数据优化编译(需先执行 -fprofile-generate )。 |
3.4.链接选项
选项 | 作用 |
---|---|
-Wl,<参数> | 传递参数给链接器(如 -Wl,--gc-sections )。 |
--gc-sections | 移除未使用的代码段(减小二进制体积,需配合 -Wl, 使用)。 |
--as-needed | 仅链接实际使用的库(避免冗余依赖)。 |
-pie | 生成位置无关可执行文件(PIE,增强地址随机化安全性)。 |
-fPIC | 生成位置无关代码(用于动态库编译)。 |
-static-libstdc++ | 静态链接 C++ 标准库(避免依赖系统库)。 |
3.5.语言特性选项(C++ 特化)
选项 | 作用 |
---|---|
-fno-rtti | 禁用 RTTI(运行时类型信息,减少代码体积)。 |
-fno-exceptions | 禁用 C++ 异常处理(减少编译后的代码)。 |
-fmodules-ts | 启用 C++20 模块(实验性特性,需配合 -std=c++20 )。 |
-fsyntax-only | 仅检查语法,不生成代码(快速排查语法错误)。 |
-pedantic | 严格遵循语言标准(禁止 GCC 扩展语法)。 |
3.6.安全增强选项
选项 | 作用 |
---|---|
-fstack-protector | 启用栈保护(防御栈溢出攻击,如缓冲区溢出)。 |
-fstack-protector-all | 对所有函数启用栈保护(更严格)。 |
-D_FORTIFY_SOURCE=2 | 增强字符串操作检查(如 strcpy 、scanf 的越界风险)。 |
-fPIE /-pie | 生成位置无关代码(配合 ASLR 地址随机化,防范 ROP 攻击)。 |
-Wl,-z,relro | 使 ELF 重定位表只读(限制攻击者篡改 GOT 表)。 |
-Wl,-z,now | 立即绑定动态符号(减少延迟绑定漏洞)。 |
3.7.架构与指令集优化
选项 | 作用 |
---|---|
-march=<arch> | 针对特定架构优化(如 -march=skylake 、-march=armv8-a )。 |
-mtune=<arch> | 调整代码针对特定架构(但保持二进制兼容)。 |
-msse4.2 | 启用 SSE4.2 指令集(Intel 处理器优化)。 |
-mavx512f | 启用 AVX-512 指令集(高端 CPU 向量化优化)。 |
-mthumb | 编译 ARM Thumb 指令集(适用于嵌入式系统)。 |
3.8.其他常用选项
选项 | 作用 |
---|---|
-fPIC | 生成位置无关代码(用于动态库 .so 编译)。 |
-shared | 生成动态库(如 gcc -shared -fPIC -o libtest.so test.c )。 |
-D<宏定义> | 编译时定义宏(如 -DDEBUG 等价于 #define DEBUG )。 |
-U<宏定义> | 取消宏定义(如 -UNDEBUG 取消 #define NDEBUG )。 |
-w | 关闭所有警告(不建议使用,隐藏潜在问题)。 |
4.常见编译组合示例
1.基础编译(C 语言)
gcc -Wall -Wextra -std=c11 -I include src/main.c -L lib -lm -o myapp
2.调试模式(C++)
g++ -g -O0 -std=c++20 -fno-omit-frame-pointer -o debug_app src/main.cpp
3.高性能优化(带安全防护)
gcc -O3 -march=native -ftree-vectorize -funroll-loops \-fstack-protector-all -D_FORTIFY_SOURCE=2 -pie -fPIE \-Wl,--gc-sections,-z,relro,-z,now -o optimized_app src/main.c
4.动态库编译(C++)
g++ -shared -fPIC -Wall -std=c++17 -o libmylib.so src/mylib.cpp
5.常用环境变量
GCC 可通过环境变量简化选项配置:
# 添加头文件搜索路径(等价于 `-I/path1 -I/path2`)
export C_INCLUDE_PATH="/path1:/path2"# 添加库文件搜索路径(等价于 `-L/path3 -L/path4`)
export LIBRARY_PATH="/path3:/path4"# 设置默认编译选项(全局生效,谨慎使用)
export CFLAGS="-Wall -O2"
export CXXFLAGS="-Wall -O2 -std=c++17"
6.注意事项
- 警告选项:始终启用
-Wall
和-Wextra
,尽早发现代码问题。 - 优化与调试冲突:优化级别(
-O2
及以上)可能导致调试信息失真,调试时建议使用-O0
。 - 架构兼容性:使用
-march=native
可针对当前 CPU 优化,但会导致二进制无法在旧架构运行。 - 安全选项组合:生产环境建议同时启用栈保护、地址随机化(
-pie
)和符号表限制(-Wl,--as-needed
)。
根据项目需求灵活搭配选项,可显著提升编译效率、程序性能或安全性。建议通过 man gcc
查看完整文档,或使用 gcc -v
查看当前编译器支持的特性。
相关链接
- CMake 官网 CMake - Upgrade Your Software Build System
- CMake 官方文档:CMake Tutorial — CMake 4.0.2 Documentation
- CMake 源码:GitHub - Kitware/CMake: Mirror of CMake upstream repository
- CMake 源码:Sign in · GitLab
相关文章:
CMake基础:gcc/g++编译选项详解
目录 1.编译步骤 2.gcc 与 g 区别 3.gcc 命令的常用选项 3.1.基础编译选项 3.2.优化选项 3.3.调试与分析选项 3.4.链接选项 3.5.语言特性选项(C 特化) 3.6.安全增强选项 3.7.架构与指令集优化 3.8.其他常用选项 4.常见编译组合示例 5.常用环…...

深入解析Java21核心新特性(虚拟线程,分代 ZGC,记录模式模式匹配增强)
文章目录 前言一、虚拟线程 (Virtual Threads - JEP 444) - 并发的革命1.1 解决的核心问题🎯1.2 工作原理与核心机制⚙️1.3 使用详解与最佳实践🛠️1.4 注意事项⚠️1.5 总结 📚 二、分代 ZGC (Generational ZGC - JEP 439) - 低延迟新高度2…...

免费批量去水印工具 - 针对文心一言生成图片
免费批量去水印工具 - 针对文心一言生成图片 工具介绍 这是一款免费的批量去水印工具,专门针对文心一言生成的图片进行处理。通过简单的操作,您可以快速去除图片中的水印。 下载链接 您可以通过以下网盘链接下载工具: 链接: https://pa…...
android 之 MediaExtractor
MediaExtractor 是Android多媒体处理的基础组件,解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具,主要作用是从媒体文件(如MP4、MKV、MP3)中分离音视频轨道数据,为后续解…...
行业案例 | ASOS 借助 Azure AI Foundry(国际版)为年轻时尚爱好者打造惊喜体验
英国潮流电商ASOS借力微软Azure OpenAI,打造生成式AI购物新体验。平台整合大语言模型与推荐引擎,通过智能聊天交互帮年轻用户探索穿搭灵感,精准匹配近900个品牌的潮流单品,实现技术升级与个性化需求的双重突破。 使用 Azure Open…...

在WPS中如何启用宏VBA wps.vba.exe下载和安装
首先我们点击导航栏中的【工具】,点击左侧 运行宏,根据提示 点击 立即加载。加载卡在50%时间比较长,耐心等待。 关闭wps重新打开后, word和xls表格都可以使用了。 如果电脑无法联网,需要提前下载 WPS VBA插件 WPS VB…...
12.7Swing控件5 JProgressBar
Swing 进度条(JProgressBar)是用于可视化展示任务完成进度的组件,通常用于显示长时间运行任务的完成百分比。以下是关于 Swing 进度条的详细介绍: 1. 基本概念与用途 作用:直观展示任务完成进度,避免用户…...

Hardware-Efficient Attention for Fast Decoding
TL;DR 2025 年普林斯顿大学提出的硬件友好 attention 设计,在 MQA/GQA 与 deepseek 提出的 MLA 基础之上继续优化,提出 Grouped-Tied Attention (GTA) 和 Grouped Latent Attention (GLA),实现更高推理效率的同时也能保持较好的模型效果。 …...

LLMs 系列科普文(13)
十三、AlphaGO 提到强化学习的历史,不得不提到 alphago,如果你不记得这是什么了,那你是否还曾记得,早些年 AI 已经可以在围棋中击败人类选手了。 AlphaGO 系统又 DeepMind 公司开发,你可以在网络上找到当初人机大战的…...
kubernetes jenkins pipeline优化拉取大仓库性能指定分支+深度
有时候我们历史的git仓库,提交了某个比较大的文件如果不限制 depth ,就会拉取所有的历史提交记录,这样在历史仓库比较大的时候 clone 非常之慢,而实际上我们只需要最新的代码来构建就行了,为了优化性能,我们…...

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案
在使用 Vue 框架开发项目时,Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题,直接复制element官网上的的案例下来也是不得,经过调试和探索,终于找到了解决方案,特此记录分享…...
UDP:简洁高效的报文结构解析与关键注意事项
UDP(User Datagram Protocol)以其无连接、低开销的特性,成为实时应用(如视频、游戏、DNS)的首选传输协议。深入理解其报文结构和注意事项,是高效利用UDP的基础。 一、UDP报文结构:简洁的四段式 …...

idea 启动jar程序并调试
添加一个JAR 应用程序,填写以下内容: JAR路径:填写你要启动的jar程序的绝对路径 虚拟机选项:-Xmx1G -Xms1G -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 程序实参(可选,minecraft专用…...

CSS 轮廓(Outline)与边框(Border)的深度解析
在 CSS 中,轮廓(outline)和边框(border)是两个用于装饰元素的重要属性,但它们在功能、渲染机制和应用场景上存在显著差异。下面从多个维度进行详细对比: 一、基础定义与语法差异 边框…...
Spring Boot 2 中 default-autowire 的使用
Spring Boot 2 中 default-autowire 的使用 在 Spring Boot 2 中,default-autowire 这个来自传统 XML 配置的概念仍然存在,但它的使用已经大大减少,因为现代 Spring Boot 应用主要使用注解驱动的配置方式。 default-autowire 在 Spring Boo…...

Docker 部署 Python 的 Flask项目
文章目录 一、构建运行 Docker 容器1. 查找合适镜像2.本地docker 拉取镜像3.项目配置1. python项目下生成 requirements.txt 依赖文件2. 生成Dockerfile文件3.忽略不必要文件4. 构建镜像 4. 运行容器5.测试 二、常见问题与解决方案 一、构建运行 Docker 容器 1. 查找合适镜像 …...
12.vite,webpack构建工具
😺😺 😺1.vite 介绍和对比 🏷️ Vite 是什么? 👉 Vite 是一个 前端构建工具 开发服务器, 可以帮你: • 开发阶段:秒开项目,改代码能瞬间热更新(…...

Vue入门到实战之第一篇【超基础】
Vue入门到实战之第一篇 学习路线1. Vue 概念1.1 Vue 是什么 2. 创建Vue实例,初始化渲染3. 插值表达式 {{ }}4. Vue响应式特性5. 开发者工具 学习路线 1. Vue 概念 1.1 Vue 是什么 概念: Vue是一个用于 构建用户界面1 的 渐进式2 框架3 1:基…...
Selenium自动化操作
1、跳转页面播放视频 我们以b站为例,测试是否可以点击模块进行播放视频 //点击页面看是否视频正常播放public void turn() throws InterruptedException {driver.findElement(By.cssSelector("#i_cecream > div.bili-feed4 > main > div.feed2 >…...

实时数据分析的技术架构:Lambda vs Kappa架构选择
文章目录 引言:实时数据分析架构的重要性Lambda架构深度解析Kappa架构技术特性架构对比分析维度性能与可扩展性评估技术栈选型指南实际应用场景分析成本效益对比模型混合架构与演进策略企业级决策框架最佳实践与案例研究技术趋势与未来展望引言:实时数据分析架构的重要性 在…...
MongoDB慢查询临时开启方法讲解
1、首先连接数据库 mongosh "mongodb://localhost:27017" 2、选择目标数据库 show databases;#显示所有数据库 use lidb;#使用某数据库 3、查看当前分析级别 db.getProfilingStatus() 输出 { was: 0, slowms: 100, sampleRate: 1, ok: 1 } #was0表示关闭&…...

springboot2.x升级springboot3.x
springboot2.x升级springboot3.x 背景升级jdk版本为17以上springboot版本修改javax包更新mybatis-plus升级swagger升级springdocspringdoc配置 背景 当前项目是springboot2.5.9版本的springbootmybatis-plus项目,需要升级到springboot3.5.0项目。 升级jdk版本为17…...

Python训练打卡Day43
复习日 1.卷积神经网络的基本概念 2.kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 tips:注册kaggle的注意事项 安装插件:Header Editor 然后打开扩展选项: 输入网址:ht…...

227.2018年蓝桥杯国赛 - 交换次数(中等)- 贪心
227. 交换次数(贪心) 1. 2018年蓝桥杯国赛 - 交换次数(中等) 标签:2018 暴力 国赛 1.1 题目描述 IT 产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称 BAT )在某海滩进行招聘活动。…...

STM32入门学习之系统时钟配置
1. 时钟就是单片机的心脏。单片机根据时钟频率来控制每个部件的工作,时钟是单片机的脉搏,决定了每条命令运行的速率,没有时钟单片机将停止工作。 如何理解“时钟决定了单片机每条命令运行的速率”? 首先需要去理解单片机中的时…...

【ArcGIS Pro微课1000例】0072:如何自动保存编辑内容及保存工程?
文章目录 一、自动保存编辑内容二、自动保存工程在使用ArcGIS或者ArcGIS Pro时,经常会遇到以下报错,无论点击【发送报告】,还是【不发送】,软件都会强制退出,这时如果对所操作没有保存,就会前功尽弃。 此时,自动保存工作就显得尤为重要,接下来讲解两种常见的自动保存方…...

AU音频软件|Audition 2025网盘下载与安装教程指南
说起AU,有些小伙伴可能第一印象是化学元素金(Aurum)。实际上,本文要介绍的AU,全称是Adobe Audition,是一款专业音频编辑和混音软件,广泛应用于音乐制作、广播、电影及视频声音设计等领域。 目…...

网络编程(TCP编程)
思维导图 1.基础流程 流程图中是TCP连接的基础步骤,其他操作都是在此基础上进行添加修改。 2.函数接口 2.1 创建套接字(socket) int socket(int domain, int type, int protocol); 头文件:#include <sys/types.h> …...
[论文阅读] 人工智能+软件工程 | 结对编程中的知识转移新图景
当AI成为编程搭档:结对编程中的知识转移新图景 论文信息 论文标题:From Developer Pairs to AI Copilots: A Comparative Study on Knowledge Transfer(从开发者结对到AI副驾驶:知识转移的对比研究) 作者及机构&#…...

热成像实例分割电力设备数据集(3类,838张)
在现代电力系统的运维管理中,红外热成像已经成为检测设备隐患、预防故障的重要手段。相比传统可见光图像,红外图像可揭示设备温度分布,从而更直观地反映过热、老化等问题。而在AI赋能下,通过实例分割技术对热成像中的电力设备进行…...