1. 程式人生 > >iOS解決兩個靜態庫的衝突 duplicate symbol

iOS解決兩個靜態庫的衝突 duplicate symbol

場景:

解決TencentOpenAPI.framework與ZbarSDK中 _base64_encode 函式的衝突

後來在網路上搜尋,刪除掉 Other Linker Flag 的 -all_load 就可以解決靜態庫衝突的問題,

但是這樣做的話,會使一些外部的靜態庫,使用objc擴充套件函式(catagory)的方法失效。例如BaiduMapApi

如果是有些庫使用到了擴充套件函式(catagory)可以分別對這個庫進行載入

使用:-force_load

-force_load BaiduMapApi/libs/Release-iphoneos/libbaidumapapi.a

(BaiduMapApi是新增到當前目錄下的)

-force_load $(BUILT_PRODUCTS_DIR)/libxxx.a

(這裡是直接新增靜態庫專案原始碼的做法)

使用-force_load分別進行載入還是蠻方便的,如果有些函式加入了main函式使用all_load就相當麻煩了。

以上可以解決TencentOpenAPI.framework與ZbarSDK的衝突

如果兩個靜態庫衝突的結構是相同的,可以考慮將兩個靜態庫拆分出來進行合併。

檢視檔案的架構有哪些
$ lipo -info libzbar.a
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386 


將armv7解壓出來 lipo libzbar.a -thin armv7 -output libzbar-armv7.a
新建立一個資料夾出來存放解壓的(.o)檔案
$ mkdir armv7
$ cd armv7 將靜態庫中的檔案解壓 $ ar -x ../libzbar-armv7.a


然後將另一個靜態庫根據以上的步驟做一遍,然後觀察連個解壓的靜態庫中,有那些是一樣的就合併在一起,不過注意的是兩個靜態庫衝突的(.o)檔案必須一致,否則也會出現錯誤。

合併完後進行打包了
$ libtool -static -o ../libnew-armv7.a *.o


如果像在虛擬機器也使用,進行相同的步驟後,將i386的架構合併再一起就可以了。 合併靜態庫
$ lipo -create -output lib.a libnew-armv76.a libi386.a

相關推薦

iOS解決靜態衝突 duplicate symbol

場景: 解決TencentOpenAPI.framework與ZbarSDK中 _base64_encode 函式的衝突 後來在網路上搜尋,刪除掉 Other Linker Flag 的 -all_load 就可以解決靜態庫衝突的問題, 但是這樣做的話,會使一些外部的靜態

使用拆分庫的方法解決iOSDuplicate Symbol靜態衝突

在自己寫SDK或者使用第三方庫的時候,可能會遇到編譯時Duplicate Symbol錯誤,本文就是通過使用拆分庫的方法,將庫中衝突的目標檔案去除,以解決此類問題。 遇到此類問題,一般都是兩個庫中包含了相同的目標檔案導致,可以通過去除其中一個庫中的衝突目標檔案來解決。 大致解決思路如下: 檢視庫支援

小心共享共用同一個靜態

)問1:如果測試中的全域性變數global_var是個帶構造和析構的類物件,會如何?(答案在最後) 問2:如果使用-fPIE替代-fPIC編譯連結,會是什麼結果了? 位置無關程式碼(PIC)對常量和函式入口地址的操作都是採用基於基暫存器(base register)BASE

Xcode other link flag引數詳解和解決靜態衝突分析

1.Xcode設定Other Link Flag 先猜一下這個引數,Other Link Flag 其他連結標誌,從字面上的意思來看,肯定程式碼連結的時候有關和連結器有關。 一個程式從簡單易讀的程式碼到可執行檔案往往要經歷以下步驟: 原始碼 > 前處理器 &

ios 解決第一頁面是通過loadData或者是loadHtml時返回控制的問題

else ont 訪問 col 狀態 load atom tro nvi 問題: webView在通過loadData或者loadHtml方法加載到第一個頁面後跳轉到其他的webView後,點擊導航條的返回按鈕時由於webView 的canGoback為NO導致我們返回不了

介紹下Python的標準 os 和 sys

保存 目錄 ges 兩個 。。 popen 後退 new int import sysprint(sys.path) #python 2 中報錯 。。。。,打印的是絕對路徑(***\\python\\lib\\site-packages# 第三方庫,後退一級為標準庫)‘‘

iOS封裝功能生成靜態.Framework

pos scree 靜態 模擬器 master screens 實現 gpo tin 在實現iOS模塊化開發的過程中,可以把固定的業務模塊生靜態庫. 本文將基於Xcode9.2創建一個簡單的工程,教大家如何制作一個自己的framework,目的就是簡單易學的制作framew

[轉] 靜態html頁面傳值方法的總結

問題 因最近嘗試實現客戶端與服務端分離,服務端只提供介面,客戶端用html+js實現,分成兩個獨立的專案部署,因專案是個人專案,客戶端展示不考慮使用像Angular、Vue、Native這種前端框架實現,於是全部使用靜態頁面實現,請求資料用ajax,在開發的過程中,就遇到了頁面之間傳

iOS開發技巧之:iOS判斷陣列中資料是否相同

IOS開發之判斷兩個陣列中資料是否相同例項詳解 前言: 工作中遇到的問題,這裡記錄下,也許能幫助到大家 例項程式碼: ? 1

Android圖片壓縮的開源:Luban和Compressor

Luban https://github.com/Curzibn/Luban Luban,也稱魯班。該庫作者一針見血的提出當前圖片壓縮處理的一些問題:單純對圖片進行裁切,壓縮已經有很多文章介紹。但是裁切成多少,壓縮成多少卻很難控制好,裁切過

iOS拆分,合併靜態以壓縮打包空間

需求:拆分iOS中體積較大的第三方靜態庫以實現軟體瘦身. 閱讀前提: 瞭解各種架構的靜態庫含義 瞭解如何使用Terminal 簡書地址 : 拆分iOS靜態庫 部落格地址 : 拆分iOS靜態庫 掘金地址 : 拆分iOS靜態庫 基本介紹 一般靜態庫中支援真機和模擬器多種CP

解決jquery並存衝突問題

jQuery自誕生以來,版本越來越多,而且jQuery官網的新版本還在不斷的更新和釋出中,現已經達到了1.6.4版本,但是我們在以前的專案中就已經使用了舊版本的jQuery,比如已經出現的:1.3.X、1.4.X、1.5.X、1.6.2等等。 由於專案的需要,必然也需要不斷的使用較新版的jQuery,但對於

解決tomcat埠衝突

我在一臺PC機上安裝了兩個tomcat,需要同時啟動,每個tomcat上跑一個程式,但是現在提示埠號衝突,需要手動更改。需要修改三個地方:1、首先: 在Tomcat的根(安裝)目錄下,有一個conf資料夾,雙擊進入conf資料夾,在裡面找到Server.xml檔案,開啟該檔案

ios-實現地點畫線相連

我們應該可能都用過一些健身類的app,都會有在你跑步的起點和終點給你跑步的路線進行畫線,如果我們也要實現這個功能我們可以做如下的步驟 1、建立地理編碼物件 2、呼叫方法去獲取地標 3、獲取CLPlacemark物件 4、建立MKPlaceMark 5、建立MKMapItem

解決虛擬機器網路介面卡都為NAT模式,其中一臺無法上網的情況

兩個虛擬機器網路介面卡都為NAT模式,同時啟動後,一個不能上網。 出現這種情況是因為:其中一個虛擬機器是另一個虛擬機器整體複製過來的,導致其MAC地址一樣。   解決方案: 1.關機 2.編輯其中一臺虛擬機器的設定選項 3.選擇網路介面卡,點選“高階” 4.在M

使用訊號量解決執行緒同步問題

1.同步問題 我們知道多道程式設計理念的提出,使得執行緒(程序)和執行緒(程序)之間可以併發執行,但是有一些特殊的情況,請看下面的例子: (https://img-blog.csdn.net/20170126160159642?watermar

解決jquery和其他衝突

方法一:jQuery.noConflict();//將變數$的控制權移交出來方法二:可以自定義一個快捷方式——var $j = jQuery.noConflict()。下面可以用$j進行dom操作。方法三:jQuery.noConflict();//將變數$的控制權移交出來 

windows 、linux 下 多靜態合併成一個靜態

第一步、 開啟visual studio 下的對應平臺命令列工具 第二步、 執行lib命令 lib /OUT:ETKey.lib A.lib B.lib ,完畢 linux 下的合成庫 Li

Mysql怎麼同步不同的不同表以及部分欄位

需求:同一個連線下(不同連線沒試過),一個庫的一張報表t_hospital同步到另一個庫的t_hospital表中,因為兩個t_hospital表部分欄位不一樣,所以只同步相同的欄位。 首先,要把原庫

iOS 計算時間的時間差

- (NSString *)intervalFromLastDate: (NSString *) dateString1 toTheDate:(NSString *) dateString2 { NSArray *timeArray1=[dateString1 co