1. 程式人生 > >編譯.a靜態庫

編譯.a靜態庫

[轉載自 部落格園 “文頂頂”]

一、簡單介紹

1.什麼是庫?

  庫是程式程式碼的集合,是共享程式程式碼的一種方式

2.庫的分類

  根據原始碼的公開情況,庫可以分為2種類型

  (1)開源庫

    公開原始碼,能看到具體實現

    比如SDWebImage、AFNetworking

  (2)閉源庫

    不公開原始碼,是經過編譯後的二進位制檔案,看不到具體實現

    主要分為:靜態庫、動態庫

二、靜態庫和動態庫

1.靜態庫和動態庫的存在形式

靜態庫:.a 和 .framework

動態庫:.dylib 和 .framework

2.靜態庫和動態庫在使用上的區別

靜態庫:連結時,靜態庫會被完整地複製到可執行檔案中,被多次使用就有多份冗餘拷貝(圖1所示)

動態庫:連結時不復制,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只加載一次,多個程式共用,節省記憶體(圖2所示)

圖1

  

  圖2

      

注意點:專案中如果使用了自制的動態庫,不能被上傳到AppStore

三、靜態庫的製作(.a)

(1)選擇“Cocoa Touch Static Library”

(2)輸入靜態庫名稱(以MJRefresh為例)

  

(3)刪除自動生成的檔案

  

(4)新增庫需要包含的原始碼

   

  

注意:資原始檔是不能打包到.a檔案中的。

(5)選擇需要暴露出來的.h檔案,.m檔案會自動編譯到.a檔案中

  

  新增,並選擇需要暴露的標頭檔案

  

設定(移動)為公開的。

(6)選擇真機裝置,然後 Command+B 編譯,libMJRefresh.a檔案從紅色變為黑色

  這個時候,程式會報錯,因為框架中包含了CGFloat,它是UIKit裡面的東西,因此可以在pch檔案中包含UIKit框架。

  

  再次進行編譯,編譯成功後生成的.a檔案就是靜態庫。

(7)選擇模擬器,依然 Command+B ,模擬器和真機環境下用的.a檔案是分開的

  

(8)右擊“Show In Finder”,檢視製作好的.a檔案

     

說明:

Debug-iphoneos資料夾裡面的東西是用在真機上的

Debug-iphonesimulator資料夾裡面的東西是用在模擬器上的 

如果Scheme是Release模式,生成的資料夾就以Release開頭

(9)合併兩個檔案

如果想讓一個.a檔案能同時用在真機和模擬器上,需要進行合併

在終端輸入指令:

  lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

說明:

藍色部分是固定指令

紅色、紫色是真機和模擬器.a檔案的路徑

綠色是所合成.a檔案的路徑

   

  生成的檔案(靜態庫)

      

提示:

1)檔案大小.a檔案的體積(一般情況下)

  真機用的.a > 模擬器用的.a

  所合成.a == 真機用的.a + 模擬器用的.a

2).a的型別

    通過lipo –info libMJRefresh.a可以檢視 .a 的型別(模擬器還是真機)

(10)如何使用.a

  直接將.a、.h、資原始檔拖拽到其他專案中即可

  別人拿到的框架,只有.a檔案和暴露出來的標頭檔案

  

注意:如果庫中還包含了一些資原始檔(如圖片等),那麼資原始檔也應該放在上面的資料夾中。

四、製作靜態庫的注意點

(1)注意:

  無論是 .a 靜態庫還是 .framework 靜態庫,最終需要的都是:二進位制檔案 + .h + 其它資原始檔

(2).a 和 .framework 的使用區別

  .a 本身是一個二進位制檔案,需要配上 .h 和 其它資原始檔 才能使用

  .framework 本身已經包含了 .h 和 其它資原始檔,可以直接使用

(3)圖片資源的處理

  如果靜態庫中用到了圖片資源,一般都放到一個bundle檔案中,bundle名字一般跟 .a 或 .framework 名字一致

  bundle的建立:新建一個資料夾,修改副檔名為 .bundle 即可,右擊bundle檔案,顯示包內容,就可以往bundle檔案中放東西

  建議:自己製作的靜態庫中要用到的圖片資源,不建議直接以png的字尾名方式拖到專案中使用,而是推薦使用放到bundle檔案中。這樣可以避免靜態庫的圖片名和使用靜態庫的專案中存在的圖片產生衝突。

  1)新建一個資料夾,把需要打包的資源圖片放在裡面

    

  2)修改副檔名為 .bundle,敲回車,點選新增。

    

(4)多檔案處理

  如果靜態庫需要暴露出來的 .h 比較多,可以考慮建立一個主標頭檔案(一般 主標頭檔案 和 靜態庫 同名)

  在主標頭檔案中包含所有其他需要暴露出來的 .h 檔案

  使用靜態庫時,只需要#import 主標頭檔案

  實際上蘋果官方就是這麼做的,例如:#import <UIKit/UIKit.h>

 (5).framework為什麼既是靜態庫又是動態庫

  系統的 .framework 是動態庫

  我們自己建立的 .framework 是靜態庫

(6)靜態庫中包含了Category(分類)

如果靜態庫中包含了Category,有時候在使用靜態庫的工程中會報“方法找不到”的錯誤(unrecognized selector sent to instance

解決方案:在使用靜態庫的工程中配置Other Linker Flags為-ObjC

相關推薦

編譯.a靜態

[轉載自 部落格園 “文頂頂”] 一、簡單介紹 1.什麼是庫?   庫是程式程式碼的集合,是共享程式程式碼的一種方式 2.庫的分類   根據原始碼的公開情況,庫可以分為2種類型   (1)開源庫     公開原始碼,能看到具體實現     比如SDWeb

Mac OS X10.10_xcode6.1_ios8.1環境下,編譯lame靜態libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集

ces mod dir helper plain per 代碼 then -m 近期升級了系統到Mac OS X 10.10 而且更新了XCode6.1和iOS 8

如何編譯靜態及將多個.a靜態合併成一個.a靜態

所使用的命令為ar 1 將所有的.a庫解壓成.o檔案ar x xx.a 2 將所有的.o 檔案合併成.aar rcs xx.b *.o 3 編譯.a 靜態庫 1)生成對應的.o 檔案 gcc -c a.c b.c 2)使用ar命令合成靜態庫 ar crs libjson.a *.o 3) 檢視編譯庫

FFmpeg3.1.1編譯IOS靜態.a檔案

一、準備工作 1.下載最新的  gas-preprocessor.pl 複製gas-preprocessor.pl到/usr/bin下, 修改檔案許可權:chmod 777 /usr/bin/gas-preprocessor.pl 2.下載編譯指令碼/FFmpeg-i

so動態a靜態編譯

一般linux環境下的連結庫分為a庫和so庫,分別表示靜態連結庫和動態連結庫,其作用是把C程式編譯好做成一種可執行連結檔案,c主程式檔案呼叫這些程式的函式介面是可以使用a庫或so庫,在主程式中只需要include含有庫中提供的函式介面宣告的標頭檔案即可。一、生成a庫首先,你需

anroid平臺NDK編譯並呼叫.a靜態和.so動態

開發環境:AS 3.1.4,Cmake編譯,Ndk 17.1。 1. 編譯靜態庫和動態庫 1.新建一個“Include C++ support”的工程,確認local.properties和gradle.properties的配置: 2.在app的build

plist文件無法打包進.a靜態

新建 null 進制 rac 是否 想法 dsm back lis 問題: 之前一直在做靜態庫的編寫與維護,也一直知道靜態庫的圖片資源是沒辦法打進.a中的。可是突然有個想法。由於有非常多參數的配置是在一個plist文件裏的。盡管也知道這是一個plist文件,可是想

dlib編譯靜態及被其它程序調用

直接 .cpp 源文件 .net .lib 文件 自己的 net xxx 一、git下載:https://github.com/davisking/dlib   官網:http://dlib.net/ 二、vs中編譯成靜態庫   1、在vs2015中創建靜態庫工程(vs20

iOS編譯OpenSSL靜態(使用指令碼自動編譯)

使用指令碼編譯:https://github.com/gitusrs/openssl-ios-build-shell-script 1、該指令碼只是一個OpenSSL編譯指令碼,使用時需要自己下載OpenSSL原始碼(openssl-*.tar.gz) 2、將 openssl-

用 Xcode 編譯 Cocoapods 靜態

在開發中用 Cocoapods 託管開放給第三方的 SDK 框架是很方便的,但是在實際應用中卻發現,cocoapods 的 lint 檢驗過於嚴格,在建立 framework 時經常因為各種無法描述的問題導致 xcodebuild 編譯失敗或者校驗無法通過。 對於一些複雜專

curl編譯linux靜態及使用總結

一、安裝OPENSSH 1、上傳檔案並解壓 openssl-1.0.2k.tar.gz 2、執行 ./config no-asm make make install 備註:如果要編譯動態庫,需要增加引數如下: ./config no-asm --shared 3、生成的檔

Xcode8 製作.a靜態和存放xib和圖片的.bundle

1、建立MyLibrary靜態庫 如圖:選擇Cocoa Touch Static Library 點選下一步,然後起工程的名字就叫:MyLibrary 選擇庫型別 建立完畢的的樣子就是下圖: 專案建立完成圖 為了使庫的標頭檔案被外面的專案工程找到並呼叫,

Mac_XCode編譯ios靜態

在 xcode 下編譯並使用 ios 的 .a 靜態庫 整個過程也類似 vs 編譯 lib靜態庫 新建靜態庫工程 File -> New -> Project

iOS Xcode工程新增.a檔案引起錯誤的幾種修改方法(一般是微信的.a靜態出錯)

Ios Xcode工程新增.a檔案引起錯誤的幾種修改方法(一般是微信的.a靜態庫出錯) 一、     TARGETS -> Build Settings-> Search Paths下 1.  Library Search Paths 刪除不存在的路徑,保留.a

Cocoapods 打包framework或者.a靜態

1、通過pod lib命令完成初始專案的搭建 (即配置podspec) 開啟終端,執行以下命令 pod lib create XXX 以測試工程為例我建立了一個TestSDK工程,初始化自動開啟。 以下是pod為我們建立的工程 2、編寫SDK相關邏輯程式碼均

iOS打包.a靜態步驟

打包靜態庫流程 1.建立靜態庫 2.實現類 3.公開.h檔案 4.打包模擬器靜態庫 5.打包真機靜態庫 6.合併模擬器 和 真機 靜態庫 7.測試靜態庫 一、前期工作 1、新建.a靜態

iOS開發之靜態(三)—— 圖片、介面xib等資原始檔封裝到.a靜態

轉自:https://blog.csdn.net/mylizh/article/details/38707175編譯環境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3)一、首先將資原始檔打包成bundle新建

linux 下編譯生成靜態和動態

我們此處為了說明靜態庫和動態庫的編譯,會使用示例程式碼。建立  test.h, hello.cpp 和 world.cpp, 在兩個原始檔中分別實現兩個函式( 此處都是示例程式碼,檔案命名不規範,理解意思即可 )。test.h (靜態庫標頭檔案)#ifndef _TEST_

linux下簡單編譯靜態編譯使用

庫函式,那麼一般來說庫函式分為兩種方式:靜態庫和動態庫。兩者的區別其實很小,靜態庫是必須要連結到執行檔案中去的,而動態庫是不需要連結到最後的執行檔案中的。怎麼理解呢?也就是說,對於最後的執行檔案而言,

使用 MinGW 編譯 ZeroMQ 靜態

最近折騰zeromq,嘗試用 MinGW 來編譯了一下。 根據 http://zeromq.org/build:mingw 的說明,用MinGW來編譯 ZeroMQ 自然是沒有問題的。但是業餘測試一些簡單的程式碼還是用靜態庫比較方便。怎奈何,預設的 configure