詳解 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.pswp.cn/bicheng/80251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80251.shtml
英文地址,請注明出處:http://en.pswp.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掃描…