1. 程式人生 > >iOS 引用外部靜態庫(.a檔案)時,Category方法無法載入問題

iOS 引用外部靜態庫(.a檔案)時,Category方法無法載入問題

問題:

+[UIImage imageNamedFromBundleWithPNG:]: unrecognized selector sent to class 0x199812698

解決方法為:找到 target 的圖示,更改其 Other Linker Flags 為: -all_load 或 -force_load
-force_load,後跟隨一個檔案位置,可以更精確地載入所需檔案。

簡單點說就是,Objective-C 的動態特性使得需要,為連結器新增一個標籤(設定 Other Linker Flags 為 -ObjC)來解決通過 Category 向類新增方法的問題。
但這個標籤 -ObjC 在 64 位 和 iOS 中有問題,需要使用 -all_load 或 -force_load。



總結如下:
如果,第三庫中沒有 category,Other Linker Flags 無需設定
如果,第三方庫中有 category,需要設定為 -ObjC
如果,某些 Xcode 版本中,出現問題,修改設定為 -all_load

-ObjC

這個flag告訴連結器把庫中定義的Objective-C類和Category都載入進來。這樣編譯之後的app會變大(因為載入了其他的objc程式碼進來)。但是如果靜態庫中有類和category的話只有加入這個flag才行。

-all_load

這個flag是專門處理-ObjC的一個bug的。用了-ObjC以後,如果類庫中只有category沒有類的時候這些category還是載入不進來。變通方法就是加入-all_load或者-force-load。-all_load會強制連結器把目標檔案都載入進來,即使沒有objc程式碼。-force_load在xcode3.2後可用。但是-force_load後面必須跟一個只想靜態庫的路徑。

如果專案中同時需要加入多個靜態庫,有的靜態庫必須加入-ObjC,而另外的庫不需要加入,加入之後報錯,看一下出錯資訊,

duplicate symbol _OBJC_CLASS_$_UMANSBJsonWriter in:

    /Users/tempus-mac/Desktop/CococProject01/CococProject/Class/libMobClickLibrary.a(UMSBJsonWriter.o)

    /Users/tempus-mac/Desktop/CococProject01/CococProject/Class/sdk/libTFTPayPlugin.a(UMSBJsonWriter.o)

ld: 472 duplicate symbols for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


是一個靜態庫中包含了另一個靜態庫,導致有些檔案重複了。

相關推薦

iOS 引用外部靜態(.a檔案Category方法無法載入問題

問題: +[UIImage imageNamedFromBundleWithPNG:]: unrecognized selector sent to class 0x199812698 解決方法為:找到 target 的圖示,更改其 Other Linker Flags

iOS svn提交靜態.a檔案

使用命令列新增檔案 1.開啟終端,輸入cd,空格,然後將需要上傳的.a檔案所在的資料夾(不是.a檔案)拖拽到終端(此辦法無需輸入繁瑣的路徑,快捷方便) ,回車; 2.之後再輸入如下命令:svn add libOCMock.a,回車; 3.之後會出現:A  (bin)  

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

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

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新建

IOS生成同時支援armv7,armv7s,i386的靜態.a檔案

轉載自:http://www.cnblogs.com/wt616/p/IOS%E5%88%B6%E4%BD%9C%E9%9D%99%E6%80%81%E5%BA%93%E6%96%87%E4%BB%B6.html 許多第三方提供的.a檔案(一般是那些SDK),嵌入到我

iOS 打包靜態.a檔案

製作.a 1、新建專案 –> Cocoa Touch Static Library 2、新增庫需要包含的程式碼 3、將需要暴露的.h檔案暴露出來,.m會自動編譯到.a檔案中 4、分別選擇真機裝置和模擬器,command + B編譯,st

打包靜態.a檔案方法(ar,ranlib,nm命令介紹

這是由於最早在Unix系統上ar程式是單純用來打包多個.o到.a(類似於tar做的事情),而不處理.o裡的符號表。Linker程式則需 要.a檔案提供一個完整的符號表,所以當時就寫了單獨的ranlib程式用來產生linker所需要的符號資訊。也就是說,產生一個對linker合 格的的.a檔案需要做ar和ra

iOS 生成靜態.a檔案

做iOS開發的同學們都知道,我們在開發的過程中經常用到一些第三方的庫,我們可以呼叫,但是看不見他們的原始碼。 有時我們不想別人看見我們的原始碼,也需要生成靜態庫,那怎麼生成呢? 首先,我們要建立一個CoCoa Touch Static Library工程 建立一個CoCoa

SVN 預設忽略靜態 .a檔案解決辦法

我是在向SVN伺服器上傳檔案時,遇到了這個問題,檔案上傳後,再下載後發現所有的.a檔案全部丟失,後來才知道是上傳檔案的時候.a檔案根本就沒傳上去,查詢原因才知道上傳的時候.a檔案被過濾掉了,後來找到了解決的辦法,大家可以借鑑下。 1、右鍵Finder,選擇 前往

ios開發之靜態(.a)的生成及使用

一、靜態庫定義:         在應用中,有些公共的程式碼需要反覆使用 的程式碼,希望隱藏程式碼的具體實現,可以把這部分程式碼做出靜態庫(.a檔案);如果提供庫的原始碼稱為開源庫(能看見.h也能看見.m檔案),不提供原始碼的庫稱為閉源庫(靜態庫,動態庫) 二、靜態庫的特

ubuntu下gcc連結靜態.a檔案

    ubuntu系統下需要連結.a靜態庫檔案,查找了一些資料執行gcc命令發現都不能連結成功。最後自己通過一些測試,成功連結並且執行。     使用命令如下: gcc -o test dll_test.c -L  ./  SDKUseDll.a     說明: test

sqlite原始碼在mac編譯靜態.a檔案

下載最新原始碼: http://sqlite.org/sqlite-src-3071401.zip 解壓 ./configure 修改Makefile檔案 找到  sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqli

建立靜態.a檔案和動態.so

  示例五 檢視靜態庫中的檔案   [[email protected] lib]# ar -t libhycu.a   base64.c.o   binbuf.c.o   cache.c.o   chunk.c.o   codec_a.c.o   …   xort.c.o   [[email&#

OpenCv在win下靜態的編譯和使用以及部分無法解析外部符號的錯誤解決

這裡演示的是opencv3.4版本的編譯和使用過程。1、靜態庫編譯CMake進行配置,編譯時我選擇build目錄為build-static。其中需要設定選擇安裝目錄,設定   “CMAKE_INSTALL_PREFIX”  為   /build-static/install 

idea建立新的類(檔案自動新增作者建立時間(檔案註釋等資訊的設定方法

一、文件註釋(設定後建立新檔案自動生成如下 二、設定方式(如下圖)調出設定選項快捷鍵 Mac下快捷方式Command + , 寫法 釋義 ${PACKAGE_NAME} n

檔案移動提示“操作無法完成應為檔案已在SQL Server(MSSQLSERVER)中開啟解決方法

也許是因為我的SQL SERVER2005必須要提供管理員許可權方可進行使用,所以在移動的時候經常提示 操作無法完成,應為檔案已在SQL Server(MSSQLSERVER)中開啟 百度了一下,一位大神的解決方法很有效 開始--》Microsoft SQL Serv

Lunix下codeblocks靜態(.a檔案及動態(.so檔案編譯

Lunix 下靜態庫.a檔案相當於windows下.lib檔案,.so檔案相當於windows下.dll檔案,下面來說一下編譯他們的一種方法(不唯一,可以通過terminal編譯)。 1.編譯.a檔案

《CMake實踐》筆記三:構建靜態(.a) 與 動態(.so) 及 如何使用外部共享和標頭檔案

五、靜態庫與動態庫構建 讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。 本節的任務: 1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,Hell

【轉】《CMake實踐》筆記三:構建靜態(.a) 與 動態(.so) 及 如何使用外部共享和標頭檔案

五、靜態庫與動態庫構建讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。本節的任務:1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,H

Ubuntu16.04下編譯OpenCV2.4.13靜態(.a檔案

我們在做專案的時候,經常用到的都是連結動態庫,在Linux平臺中就是.so檔案,我的另外一篇文章介紹的就是如何生成動態庫,可以參看《ubuntu 16.04下安裝使用OpenCV2.4.13(動態庫.so)》。但是有時候,我們仍然希望通過靜態呼叫的方式來使用OpenCV,這個