日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用-section等参数实现对库的裁剪,从而减小程序体积

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用-section等参数实现对库的裁剪,从而减小程序体积 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在實際的項目里面,產品中除去系統加載使用的空間外,留給具體的功能應用程序的空間較小,因此需要對應用程序用到的庫進行裁剪。比如在實際的項目中,應用程序和庫一共14M,最后進行裁剪,減少了6-7M

?對于空間有限,使用的庫較多(依賴的第三方開源庫openssl等)占用體積較大,我們如果使用動態庫(.so)顯然不適合,因此我們可以使用靜態庫(.a),但是這樣還不夠,依賴的庫中有很多實現的函數,但是應用程序并沒有使用,沒用的函數就應該不鏈接進來,占用寶貴的空間。

對此就需要修改編譯選項:

(1)編譯時加入:-ffunction-sections, -fdata-sections 選項,這樣編譯的時候,把每個函數作為一個section,每個數據(應該是指全局變量之類的吧)也作為一個section。如果不加-ffunction-sections選項,則默認似乎是每個源文件為一個section進行鏈接,這樣子只要這個文件中用到了一個函數,那么所有的函數都會被鏈接進來。

(2)鏈接時加入:--gc-sections選項 ,這樣鏈接的時候,--gc-sections會把沒用到的section丟棄掉,最終的可執行文件就只包含用到了的函數和數據。鏈接的單位,是函數級別,這樣就能丟棄沒使用的函數。

當我們依賴靜態庫,編譯和鏈接選項加如上所示后,應用程序變小,但是查看符號表等,發現一些庫中的函數依然存在,于是經過一些時間的排查,當添加上-fvisibility=hidden

在linux下,源文件中的所有函數都有一個默認的visibility屬性為public,在編譯命令中加入-fvisibility=hidden參數,會將所有默認的public的屬性變為hidden。此時,如果對函數設置__attribute__ ((visibility("default")))參數,使特定的函數仍然按默認的public屬性處理,則-fvisibility=hidden參數不會對該函數起作用。所以,設置了-fvisibility=hidden參數之后,只有設置了__attribute__ ((visibility("default")))的函數才是對外可見的,如此則效果等同于Visual Studio下的__declspec(dllexport)定義。

綜上:

修改了CMakeLists.txt:
ADD_DEFINITIONS("-Wall")
ADD_DEFINITIONS("-fPIC")
ADD_DEFINITIONS("-Wl,-Bsymbolic -lm")
ADD_DEFINITIONS("-std=c++11")
SET(CMAKE_CXX_FLAGS "-Wall -fPIC -s -fvisibility=hidden -ffunction-sections -fdata-sections -Wl,-rpath-link=$(../../../Library/ISVP_T20Z/lib) -Wl,-Bsymbolic -lm -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DISVP")

???????

總結

以上是生活随笔為你收集整理的使用-section等参数实现对库的裁剪,从而减小程序体积的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。