閱讀88 返回首頁    go 阿裏雲 go 技術社區[雲棲]


iOS庫衝突的問題---動態庫導入

1.什麼是庫

首先來看什麼是庫,庫(Library)說白了就是一段編譯好的二進製代碼,加上頭文件就可以供別人使用。

什麼時候我們會用到庫呢?一種情況是某些代碼需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進行封裝,隻暴露出頭文件。另外一種情況是,對於某些不會進行大的改動的代碼,我們想減少編譯的時間,就可以把它打包成庫,因為庫是已經編譯好的二進製了,編譯的時候隻需要 Link 一下,不會浪費編譯時間。

上麵提到庫在使用的時候需要 Link,Link 的方式有兩種,靜態和動態,於是便產生了靜態庫和動態庫。

2.靜態庫和動態庫的存在形式和區別。

2.1 靜態庫和動態庫的存在形式

靜態庫:.a 和 .framework
動態庫:.dylib 和 .framework

2.2 靜態庫和動態庫的區別

靜態庫:靜態庫即靜態鏈接庫(Windows 下的 .lib,Linux 和 Mac 下的 .a)。之所以叫做靜態,是因為靜態庫在編譯的時候會被直接拷貝一份,複製到目標程序裏,這段代碼在目標程序裏就不會再改變了。
靜態庫的好處很明顯,編譯完成之後,庫文件實際上就沒有作用了。目標程序沒有外部依賴,直接就可以運行。當然其缺點也很明顯,就是會使用目標程序的體積增大。

動態庫:動態庫即動態鏈接庫(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。與靜態庫相反,動態庫在編譯時並不會被拷貝到目標程序中,目標程序中隻會存儲指向動態庫的引用。等到程序運行時,動態庫才會被真正加載進來。

動態庫的優點是,不需要拷貝到目標程序中,不會影響目標程序的體積,而且同一份庫可以被多個程序使用(因為這個原因,動態庫也被稱作共享庫)。同時,編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼。動態庫帶來的問題主要是,動態載入會帶來一部分性能損失,使用動態庫也會使得程序依賴於外部環境。如果環境缺少動態庫或者庫的版本不正確,就會導致程序無法運行(Linux 下喜聞樂見的 lib not found 錯誤)。

注意:為避免衝突目前阿裏視頻雲的端SDK都提供的是動態庫

3.動態庫導入

示例以短視頻SDK導入為示例,其他播放器和連麥SDK可參考.
直接引入SDK的framework,名稱為 AliyunVideoSDKPro

  1. 開發者打開工程,選中目標target,依次選擇"Build Phases"->"Link Binary With Libraries",點擊"+"號,點擊“Add Other...”,導入AliyunVideoSDKPro.frameworkQuCore-ThirdParty.framework
  2. 開發者打開工程,選中目標target,依次選擇"General"->"Embededed Binaries",點擊"+"號,點擊“Add Other...”,導入AliyunVideoSDKPro.frameworkQuCore-ThirdParty.framework

  3. 同時,還需依賴libz.tbdImageIO.frameworkCoreMedia.frameworkCoreVideo.frameworkVideoToolBox.frameworkMediaPlayer.frameworkOpenAL.frameworklibc++.tbd,libsqlit3.tbd,libiconv.tbd請一並加上。截圖如下:

依賴庫示例

  1. 配置 Build Setting -- Linking -- Other Linker Flags 添加 -ObjC選項

最後更新:2017-08-25 11:32:28

  上一篇:go  淺談智能質檢在客服領域的應用
  下一篇:go  開源大數據周刊-第65期