使用-section等参数实现对库的裁剪,从而减小程序体积
在實際的項目里面,產(chǎn)品中除去系統(tǒng)加載使用的空間外,留給具體的功能應(yīng)用程序的空間較小,因此需要對應(yīng)用程序用到的庫進行裁剪。比如在實際的項目中,應(yīng)用程序和庫一共14M,最后進行裁剪,減少了6-7M
?對于空間有限,使用的庫較多(依賴的第三方開源庫openssl等)占用體積較大,我們?nèi)绻褂脛討B(tài)庫(.so)顯然不適合,因此我們可以使用靜態(tài)庫(.a),但是這樣還不夠,依賴的庫中有很多實現(xiàn)的函數(shù),但是應(yīng)用程序并沒有使用,沒用的函數(shù)就應(yīng)該不鏈接進來,占用寶貴的空間。
對此就需要修改編譯選項:
(1)編譯時加入:-ffunction-sections, -fdata-sections 選項,這樣編譯的時候,把每個函數(shù)作為一個section,每個數(shù)據(jù)(應(yīng)該是指全局變量之類的吧)也作為一個section。如果不加-ffunction-sections選項,則默認似乎是每個源文件為一個section進行鏈接,這樣子只要這個文件中用到了一個函數(shù),那么所有的函數(shù)都會被鏈接進來。
(2)鏈接時加入:--gc-sections選項 ,這樣鏈接的時候,--gc-sections會把沒用到的section丟棄掉,最終的可執(zhí)行文件就只包含用到了的函數(shù)和數(shù)據(jù)。鏈接的單位,是函數(shù)級別,這樣就能丟棄沒使用的函數(shù)。
當我們依賴靜態(tài)庫,編譯和鏈接選項加如上所示后,應(yīng)用程序變小,但是查看符號表等,發(fā)現(xiàn)一些庫中的函數(shù)依然存在,于是經(jīng)過一些時間的排查,當添加上-fvisibility=hidden
在linux下,源文件中的所有函數(shù)都有一個默認的visibility屬性為public,在編譯命令中加入-fvisibility=hidden參數(shù),會將所有默認的public的屬性變?yōu)閔idden。此時,如果對函數(shù)設(shè)置__attribute__ ((visibility("default")))參數(shù),使特定的函數(shù)仍然按默認的public屬性處理,則-fvisibility=hidden參數(shù)不會對該函數(shù)起作用。所以,設(shè)置了-fvisibility=hidden參數(shù)之后,只有設(shè)置了__attribute__ ((visibility("default")))的函數(shù)才是對外可見的,如此則效果等同于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")
???????
總結(jié)
以上是生活随笔為你收集整理的使用-section等参数实现对库的裁剪,从而减小程序体积的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim显示缩进对齐线
- 下一篇: c语言--找钱