




免費預覽已結束,剩余1頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
福利貼:資深攻城獅教你如何縮短開發周期文/李強一、 問題引入在當下的開發中,應用的功能做的越來越復雜,工程也越來越大,所以為了盡可能縮短開發周期,不可避免的會用到許多第三方庫,隨之而來的也會遇到好 多問題。比如,程序調用函數 funa,funa 函數從在于兩個庫 liba.a,libb.a 中,并且程序執行需要連接這兩個庫,那么程序執行時是調用 liba.a 中 funa 還是調用的 libb.a 中的 funa 呢?其實這個取決于鏈接時的順序,比如先鏈接的 liba.a,這個時候通過 liba.a 的導出符號表就可以找到 funa 在 liba.a 中定義,并加入符號表中;鏈接 libb.a 的時候發現符號表已經存在 funa,就不會再次更新符號表,所以調用的始終是 liba.a 中的 funa 函數。這里的調用嚴重的依賴于鏈接庫加載的順序,很大程度上會導致混亂。作為 SDK 的提供者,我們尤其要避免這點。正常我們使用的庫中包含了好多符號信息,如圖 1 所示:圖1這些符號信息有以下幾個弊端:1、增大了庫的體積;2、隱蔽性較差;3、容易帶來沖突。 在開發過程中第三點帶來的問題尤其嚴重,特別是當我們提供的 SDK 用到第三方庫的時候(因為使用我們 SDK 的客戶也有可能用到跟我們一樣的第三方庫)。二、 解決辦法1、對第三方庫處理下面繼續以 x264(下文以 libx264.a 帶過)為例說明如何編譯第三方的庫。 沒有隱藏符號的第三方庫如“圖 1”所示,函數前面會帶有 external 的標示。在最終對外發布的 SDK 中_x264_predict_16x16_dc_c 還是打著 external 的標簽, 及對外可見。如圖 2 所示:圖2隱藏符號后,在 libx264.a 中,原先打上 external 標簽的函數,會以 private external 標識。如圖 3 所示:圖3那么如何才能得到我們想要的、打上 private external 標簽的庫呢,有兩種方 法可以做到。1)對每個函數加屬性 _attribute_(visibility(“hidden”) void funa_hidden() printf(“hidden symboln”); void funa_visible() printf(“exported symbol”); 這樣做的好處是可以根據需要對每個函數做定制處理。但若我們用到的三方 庫代碼量大,這種方法就是費時費力了。2)編譯庫時統一處理利用 gcc 的擴展屬性,編譯庫時加上-fvisibility=hidden。 a) 靜態庫gcc static o libtest.a fvisibility=hidden c test.cb) 動態庫gcc dynamic o libtest.so fvisility=hidden c test.c其中 dynamic 為 clang 的寫法,大部分 gcc 寫法為 shared。上邊兩種方法只處理了 c/c+,因為語法問題,匯編需要做特殊里,但也是 在函數頭加屬性,但它的屬性寫法為.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因為需要處理的匯編文件較少,所以對匯編采用了直接編輯源文件的方法。 其實個人覺得也應該能在編譯時做統一處理,有興趣的可以自己找一下方法。2、對 xcode工程的處理對 xcode 工程處理相對直觀、簡單了許多。只需在工程的設置里做如下處理。.1) 打開工程設置,跳轉到 build setting 頁面;.2) 搜索 hidden;.3) 將 Symbols Hidden by Default 設置 Yes;圖4其實通過觀察編譯的過程可以發現,通過上述設置,蘋果最終將其轉化為步驟 1 的命令進行編譯。編譯的結果也是在庫里加了 private external 而已。3、符號剝離最后一步,也是最關鍵的一步,就是真正將步驟 1 或步驟 2 中打上 private external 標簽的函數做最終的處理,把它們從要發布的庫里剝離。1) 首先設置 prelink在 target 的 build setting 里搜索 prelink,將 Perform Single-Object Prelink 置為Yes,然后把該工程需要的庫都直接拖到 Prelink libraries 中。如圖 5 所示:圖5將 Deployment Postprocessing 置為 Yes。如圖 6 所示:2) 設置 post process圖6將 Strip Style 設置為 Non-Global Symbols。如圖 7 所示:3) 設置剝離方式圖7到目前為止,所有的設置都已經完成,接下來編譯。有興趣的同學可以觀察一下編譯的過程,會發現通過設置 prel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024四川雅安市市屬國有企業高級管理人員8人筆試參考題庫附帶答案詳解
- 初中物理人教版(2024)八年級上冊(2024)第3節 汽化和液化教案配套
- 發票勾選平臺培訓
- 2024華電江西發電有限公司所屬企業面向系統內外公開招聘4人筆試參考題庫附帶答案詳解
- 2024北京飛機維修工程有限公司市場化人才招聘筆試參考題庫附帶答案詳解
- 人教部編版 (五四制)一年級下冊13 荷葉圓圓教案設計
- 冀教版一年級下冊五 100以內的加法和減法(一)教案設計
- 人音版八年級上冊老鼠娶親教學設計
- 服裝入門培訓課件
- 三年級英語上冊 Unit 1 School and Numbers Lesson 2 Boy Girl and Teacher教學設計 冀教版(三起)
- 2023年-2024年電子物證專業考試復習題庫(含答案)
- 新能源汽車發展現狀參考文獻
- 春季行車安全注意事項春季行車安全教育
- 焊接工序首件檢驗記錄表
- 注塑工藝監控記錄表
- WORD文檔標題格式模板(五級標題)
- “四會”教學基本概述
- 延續證書承諾書格式
- 高金英講座完整版
- 技術創新的內涵與核心
- 高考歷史考點命題雙向細目表(很實用)
評論
0/150
提交評論