详解 FFMPEG 交叉编译 `FLAGS` 和 `INCLUDES` 的作用

FLAGSINCLUDES这两行是 Android NDK 编译时的编译器选项,用于控制代码生成、优化、调试、安全性和头文件搜索路径。下面逐项详解:


1. FLAGS 详解(编译器选项)
FLAGS 定义了传递给 C/C++ 编译器(如 clanggcc) 的选项,影响代码的编译方式:

(1) 调试相关选项

选项作用
-g生成调试信息(DWARF 格式),用于 gdb/lldb 调试
-O0禁用优化(-O0 = 不优化,-O2/-O3 = 优化代码)
-fno-limit-debug-info不限制调试信息大小,保留更多变量名和符号

适用场景:开发调试阶段使用,发布时应移除 -g -O0 -fno-limit-debug-info,改用 -O2 优化性能。


(2) Android 平台定义

选项作用
-DANDROID定义宏 ANDROID,代码中可用 #ifdef ANDROID 判断平台

(3) 代码分段 & 体积优化

选项作用
-fdata-sections每个变量放在独立的 ELF section
-ffunction-sections每个函数放在独立的 ELF section
-funwind-tables生成堆栈展开信息,用于异常处理和崩溃分析

适用场景:配合链接器选项 -Wl,--gc-sections 可删除未使用的代码,减小 .so 体积。


(4) 安全性增强

选项作用
-fstack-protector-strong栈溢出保护(防止缓冲区溢出攻击)
-D_FORTIFY_SOURCE=2增强 memcpy/strcpy 等函数的安全性检查
-Wformat -Werror=format-security检查 printf/scanf 的格式字符串漏洞,错误直接报错

适用场景:所有正式版本都应启用这些选项,防止安全漏洞。


(5) 兼容性 & 稳定性

选项作用
-no-canonical-prefixes禁止路径标准化,避免交叉编译问题
-mstackrealign强制栈对齐(某些老旧 ARM 设备需要)
-std=c++11使用 C++11 标准(需代码支持 C++11)
-fPIC生成位置无关代码(.so 动态库必须)

适用场景:

  • -fPIC 是共享库(.so)的强制要求,否则加载会失败。
  • -std=c++11 可根据项目需求改为 -std=c++14/-std=c++17

2. INCLUDES 详解(头文件搜索路径)
INCLUDES 定义了 编译器查找头文件的路径:

INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"
选项作用
-isystem指定系统头文件目录(比 -I 优先级低,避免覆盖标准头文件)
$NDK_ROOT/sources/android/support/includeAndroid 支持库的头文件路径(如 android/support/*.h

适用场景:

  • 如果代码使用了 android/support 库(如兼容旧版 API),则需要此路径。
  • 通常和 -isysroot $NDK_ROOT/sysroot 配合使用。

3. 完整编译示例

# 设置 NDK 路径
export NDK_ROOT=/path/to/ndk
export ANDROID_API=24# 编译选项
FLAGS="-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++11 -O0 -fno-limit-debug-info -fPIC"
INCLUDES="-isystem $NDK_ROOT/sources/android/support/include"# 传递给 FFmpeg/CMake 等构建系统
./configure \--extra-cflags="$FLAGS $INCLUDES" \--extra-ldflags="-Wl,--gc-sections"  # 删除未使用的代码

4. 总结

选项类别作用是否必须?
调试选项 (-g -O0)方便调试,但影响性能开发时启用,发布时移除
安全选项 (-fstack-protector, -D_FORTIFY_SOURCE=2)防止内存/格式化字符串漏洞必须
体积优化 (-fdata-sections, -ffunction-sections)配合 -Wl,--gc-sections 减小 .so 大小推荐
Android 支持 (-DANDROID, -isystem)定义平台宏,支持 Android 特有头文件必须
C++ 标准 (-std=c++11)指定 C++ 版本按需调整
PIC 代码 (-fPIC)生成位置无关代码(动态库必须)必须

建议:
• 开发阶段:保留 -g -O0 方便调试。

• 发布阶段:移除 -g -O0,改用 -O2 优化性能,并确保安全选项开启。

常见问题​​

  • 为什么发布版不能用 -O0?​​
    -O0 会禁用优化,导致性能极差(可能慢 10 倍以上)。
  • ​​-fPIC 报错怎么办?​​
    检查是否遗漏了 -fPIC,或尝试显式指定 -fPIE(Android 7.0+ 可替代)。
  • ​​如何进一步减小库体积?​​
    添加链接选项:-Wl,–gc-sections -Wl,–strip-all。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RK3588嵌入式图形编程】-Cairo-Cairo图形库支持后端

Cairo图形库支持后端 文章目录 Cairo图形库支持后端1、PNG图像后端2、PDF文件后端3、SVG文件后端4、GTK窗口支持Cairo库支持多种后端。在本文中,我们使用Cairo创建PNG图像、PDF文件、SVG文件,并在GTK窗口上绘制。 1、PNG图像后端 在第一个示例中,我们创建一个 PNG 图像。 …

【常用算法:排序篇】2.快速排序的算法精要

快速排序是算法领域的"九阳神功",掌握其精髓能让你在算法修炼之路上突破瓶颈。 1. 快速排序的核心思想 快速排序(Quicksort)是一种基于分治思想的高效排序算法,核心步骤为: 选择基准值(Pivot&…

在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考

PDF 文档在现代 Web 应用中越来越常见,无论是作为文档预览、报告展示还是在线编辑的载体。Mozilla 的 PDF.js 是一个功能强大的 JavaScript 库,它使得在浏览器端渲染和显示 PDF 文件成为可能,无需依赖原生插件。 本文将深入探讨如何在你的项…

基于FPGA控制ADC0832双通道采样+电压电流采样+LCD屏幕显示

基于FPGA控制ADC0832双通道采样电压电流采样LCD屏幕显示 前言一、芯片手册阅读1.SPI通信时序 二、仿真分析三、代码分析总结视频演示 前言 定制 要求使用ADC0832芯片进行ADC采样。其中电压采样以及电流采样是固定电路,是硬件设计,跟软件没没关系。本质上…

生产部署方案pm2配合python3脚本

前言 使用python3来处理redis 消息队列,记录下生产部署方案 「生产部署方案」: 多进程(动态扩容)无限自愈日志自动压缩系统级守护可多队列多worker 终极稳健版:PM2 Logrotate 自动扩容 守护链 适合&#xff1a…

Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件

文章目录 一、需求分析与安全前置:为什么需要专用工具?1.1 痛点场景1.2 技术方案选择 二、准备工作:Gmail账号安全配置与环境搭建2.1 开启两步验证(必做!)2.2 创建应用专用密码(替代普通密码&am…

巧用python之--模仿PLC(PLC模拟器)

工作中用到了VM(VisionMaster4.3)有时候需要和PLC打交道,但是PLC毕竟是别人的,不方便修改别人的程序,这时候需要一个灵活的PLC模拟器是多么好呀! 先说背景: PLC型号 汇川Easy521: Modbus TCP 192.168.1.10:502 在汇川Easy521中Modbus保持寄存器D寄存器 ,在modbus协议中 0-4区…

docker构建镜像并上传dockerhub

docker构建镜像并上传dockerhub 前提条件:需要连接梯子 将梯子配置到虚拟机中(确保主机能够连接 hub.docker.com) 使用ipconfig 查询主机的 ip4地址虚拟机的连接模式改成桥接模式(复制主机的地址网络)将ip4配置到虚拟…

python实现的音乐播放器

python实现的音乐播放器 音乐播放器,原来写过一个简陋的例子,可见 https://blog.csdn.net/cnds123/article/details/137874107 那个不能拖动播放进度条上的滑块到新的位置播放。下面介绍的可以拖动播放进度条上的滑块到新的位置播放。 简单实用的音乐播放器 这个简单实用的…

[网安工具] 端口信息收集工具 —— 御剑高速 TCP 全端口扫描工具 · 使用手册

🌟想了解其它网安工具?看看这个:[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 https://github.com/NepoloHebo/Yujian-high-speed-TCP-full-port-scannerhttps://github.com/NepoloHebo/Yujian-high-speed-TCP-full-port-scanner 0…

数字孪生赋能智慧城市:从概念到落地的深度实践

在城市规模与复杂度持续攀升的当下,传统管理模式已难以满足现代城市精细化治理需求。数字孪生技术凭借构建虚拟城市镜像、实现实时数据交互与智能决策的特性,成为智慧城市建设的核心引擎。本文将通过多个典型案例,深度解析数字孪生技术如何重…

DeFi开发系统软件开发:技术架构与生态重构

DeFi开发系统软件开发:技术架构与生态重构 ——2025年去中心化金融开发的范式革新与实践指南 一、技术架构演进:从单一链到多链混合引擎 现代DeFi系统开发已从单一公链架构转向“跨链互操作混合模式”,结合中心化效率与去中心化安全双重优势…

相同IP和端口的服务器ssh连接时出现异常

起因 把服务器上的一个虚拟机搞坏了,所以删除重新创建了一个,端口号和IP与之前的虚拟机相同。 ssh usernameIP -p port 时报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…

验证es启动成功

1. 查看命令行输出信息 在启动 Elasticsearch 时,命令行窗口会输出一系列日志信息。若启动成功,日志里通常会有类似下面的信息: plaintext [2025-05-06T13:20:00,000][INFO ][o.e.n.Node ] [node_name] started其中 [node_na…

CentOS网络之network和NetworkManager深度解析

文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段(CentOS 5-6)1.2 过渡期(CentOS 7)1.3 新时代(CentOS 8) 2. network和NetworkManager的核心区别3. ne…

Unity:父挂 Rigidbody2D、子挂 Collider2D 时触发器不生效的问题分析

目录 ❓问题现象 🔍 排查与定位 ⚠️ Unity 触发机制的核心要求 ✅ 为什么把 Collider2D 移到父物体后就能触发? 💡 解决方案 在 Unity 2D 游戏开发中,很多人习惯用父物体挂载 Rigidbody2D,而将不同的身体部位&am…

Google AI版图:解析AI Studio, Gemini, NotebookLM与GCP

1. 2C vs 2B: AI Studio: 主要是面向开发者,提供一个易用的界面来探索和构建基于Google模型的应用。虽然最终的应用可能服务于C端或B端,但AI Studio本身更多是一个开发者的工具平台,可以看作是连接模型能力和各种应用的桥梁。它可以被个人开…

Oracle EBS AP发票被预付款核算创建会计科目时间超长

背景 由于客户职能部门的水电、通信和物业等等费用统一管理或对接部门报销费,在报销费的时候,用户把所有费用分摊到各个末级部门,形成AP发票行有上千行, 问题症状 1、用户过账时,请求创建会计科目一直执行20多个小时未完成,只能手工强行取消请求。 2、取消请求以后,从后…

MySQL中MVCC指什么?

简要回答: MVCC(multi version concurrency control)即多版本并发控制,为了确保多线程下数据的安全,可以通过undo log和ReadView来实现不同的事务隔离级别。 对于已提交读和可重复读隔离级别的事务来说,M…

赛季7靶场 -- Checker --User flag

本系列仅说明靶场的攻击思路,不会给出任何的详细代码执行步骤,因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。root要逆向,没做了,但是user flag也有借鉴意义,关于2FA的绕过我们有必要了解 1.首先Nmap扫描…