




免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
福利貼:資深攻城獅教你如何縮短開發(fā)周期文/李強(qiáng)一、 問題引入在當(dāng)下的開發(fā)中,應(yīng)用的功能做的越來越復(fù)雜,工程也越來越大,所以為了盡可能縮短開發(fā)周期,不可避免的會(huì)用到許多第三方庫,隨之而來的也會(huì)遇到好 多問題。比如,程序調(diào)用函數(shù) funa,funa 函數(shù)從在于兩個(gè)庫 liba.a,libb.a 中,并且程序執(zhí)行需要連接這兩個(gè)庫,那么程序執(zhí)行時(shí)是調(diào)用 liba.a 中 funa 還是調(diào)用的 libb.a 中的 funa 呢?其實(shí)這個(gè)取決于鏈接時(shí)的順序,比如先鏈接的 liba.a,這個(gè)時(shí)候通過 liba.a 的導(dǎo)出符號(hào)表就可以找到 funa 在 liba.a 中定義,并加入符號(hào)表中;鏈接 libb.a 的時(shí)候發(fā)現(xiàn)符號(hào)表已經(jīng)存在 funa,就不會(huì)再次更新符號(hào)表,所以調(diào)用的始終是 liba.a 中的 funa 函數(shù)。這里的調(diào)用嚴(yán)重的依賴于鏈接庫加載的順序,很大程度上會(huì)導(dǎo)致混亂。作為 SDK 的提供者,我們尤其要避免這點(diǎn)。正常我們使用的庫中包含了好多符號(hào)信息,如圖 1 所示:圖1這些符號(hào)信息有以下幾個(gè)弊端:1、增大了庫的體積;2、隱蔽性較差;3、容易帶來沖突。 在開發(fā)過程中第三點(diǎn)帶來的問題尤其嚴(yán)重,特別是當(dāng)我們提供的 SDK 用到第三方庫的時(shí)候(因?yàn)槭褂梦覀?SDK 的客戶也有可能用到跟我們一樣的第三方庫)。二、 解決辦法1、對(duì)第三方庫處理下面繼續(xù)以 x264(下文以 libx264.a 帶過)為例說明如何編譯第三方的庫。 沒有隱藏符號(hào)的第三方庫如“圖 1”所示,函數(shù)前面會(huì)帶有 external 的標(biāo)示。在最終對(duì)外發(fā)布的 SDK 中_x264_predict_16x16_dc_c 還是打著 external 的標(biāo)簽, 及對(duì)外可見。如圖 2 所示:圖2隱藏符號(hào)后,在 libx264.a 中,原先打上 external 標(biāo)簽的函數(shù),會(huì)以 private external 標(biāo)識(shí)。如圖 3 所示:圖3那么如何才能得到我們想要的、打上 private external 標(biāo)簽的庫呢,有兩種方 法可以做到。1)對(duì)每個(gè)函數(shù)加屬性 _attribute_(visibility(“hidden”) void funa_hidden() printf(“hidden symboln”); void funa_visible() printf(“exported symbol”); 這樣做的好處是可以根據(jù)需要對(duì)每個(gè)函數(shù)做定制處理。但若我們用到的三方 庫代碼量大,這種方法就是費(fèi)時(shí)費(fèi)力了。2)編譯庫時(shí)統(tǒng)一處理利用 gcc 的擴(kuò)展屬性,編譯庫時(shí)加上-fvisibility=hidden。 a) 靜態(tài)庫gcc static o libtest.a fvisibility=hidden c test.cb) 動(dòng)態(tài)庫gcc dynamic o libtest.so fvisility=hidden c test.c其中 dynamic 為 clang 的寫法,大部分 gcc 寫法為 shared。上邊兩種方法只處理了 c/c+,因?yàn)檎Z法問題,匯編需要做特殊里,但也是 在函數(shù)頭加屬性,但它的屬性寫法為.private_extern。.macro function name, export=0, align=2 .macro endfuncELF .size name, . - name FUNC .endfunc.purgem endfunc .endm.text.align align .if export.global EXTERN_ASMnameELF .type EXTERN_ASMname, %function FUNC .func EXTERN_ASMname EXTERN_ASMname:.private_externEXTERN_ASMname.elseELF .typeFUNC .func name:.endif .endmname, %function name因?yàn)樾枰幚淼膮R編文件較少,所以對(duì)匯編采用了直接編輯源文件的方法。 其實(shí)個(gè)人覺得也應(yīng)該能在編譯時(shí)做統(tǒng)一處理,有興趣的可以自己找一下方法。2、對(duì) xcode工程的處理對(duì) xcode 工程處理相對(duì)直觀、簡(jiǎn)單了許多。只需在工程的設(shè)置里做如下處理。.1) 打開工程設(shè)置,跳轉(zhuǎn)到 build setting 頁面;.2) 搜索 hidden;.3) 將 Symbols Hidden by Default 設(shè)置 Yes;圖4其實(shí)通過觀察編譯的過程可以發(fā)現(xiàn),通過上述設(shè)置,蘋果最終將其轉(zhuǎn)化為步驟 1 的命令進(jìn)行編譯。編譯的結(jié)果也是在庫里加了 private external 而已。3、符號(hào)剝離最后一步,也是最關(guān)鍵的一步,就是真正將步驟 1 或步驟 2 中打上 private external 標(biāo)簽的函數(shù)做最終的處理,把它們從要發(fā)布的庫里剝離。1) 首先設(shè)置 prelink在 target 的 build setting 里搜索 prelink,將 Perform Single-Object Prelink 置為Yes,然后把該工程需要的庫都直接拖到 Prelink libraries 中。如圖 5 所示:圖5將 Deployment Postprocessing 置為 Yes。如圖 6 所示:2) 設(shè)置 post process圖6將 Strip Style 設(shè)置為 Non-Global Symbols。如圖 7 所示:3) 設(shè)置剝離方式圖7到目前為止,所有的設(shè)置都已經(jīng)完成,接下來編譯。有興趣的同學(xué)可以觀察一下編譯的過程,會(huì)發(fā)現(xiàn)通過設(shè)置 prel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024成都工業(yè)職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘筆試真題
- 法律科技產(chǎn)品測(cè)試員考試試卷及答案
- 跨境生鮮供應(yīng)鏈經(jīng)理筆試試題及答案
- 2025年重水堆核電站及配套產(chǎn)品項(xiàng)目發(fā)展計(jì)劃
- 2025年宿州蕭縣幼兒園教師招聘考試試題【答案】
- 消費(fèi)的演講稿
- 2025年閑置物品調(diào)劑回收項(xiàng)目發(fā)展計(jì)劃
- 《自動(dòng)檢測(cè)與轉(zhuǎn)換技術(shù)》第二版的單項(xiàng)選擇題的參考答案
- 2025年優(yōu)良動(dòng)植物新品種項(xiàng)目合作計(jì)劃書
- 2025年抗麻風(fēng)病藥項(xiàng)目建議書
- 教師安全培訓(xùn)內(nèi)容課件
- 2025年廣州市事業(yè)單位教師招聘考試生物學(xué)科專業(yè)知識(shí)試題
- 2025年電梯檢驗(yàn)員資格考試試卷-電梯轎廂與導(dǎo)軌維護(hù)試題
- 2025年宜賓市中考語文試題卷(含答案詳解)
- 幼兒小小運(yùn)動(dòng)會(huì)活動(dòng)方案
- C語言程序設(shè)計(jì)說課課件
- 2023年對(duì)外漢語教育學(xué)引論知識(shí)點(diǎn)
- 對(duì)立違抗障礙行為矯正
- 高一下學(xué)期期末考模擬卷(第一、二冊(cè)綜合)(基礎(chǔ))- 《溫故知新》2025-2026學(xué)年高一數(shù)學(xué)下學(xué)期復(fù)習(xí)課(人教A版2029必修第二冊(cè))(原卷版)
- 《文旅服務(wù)信息資源分類及編碼規(guī)范》
- 《市域(郊)鐵路設(shè)計(jì)規(guī)范》條文說明
評(píng)論
0/150
提交評(píng)論