iOS開發 引用第三方庫出現duplicate symbol時的處理方法

来源:http://www.cnblogs.com/CodingWalkers/archive/2016/03/25/5318726.html
-Advertisement-
Play Games

該篇文章是我自己從我的新浪博客上摘抄過來的, 原文鏈接為: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html 在iOS開發中, 難免會集成別人的三方類庫, 當集成的三方類庫過多時, 難免會出現某些庫同時使用了同樣的函數庫,導致link的時候報錯 ...


  該篇文章是我自己從我的新浪博客上摘抄過來的, 原文鏈接為: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html     在iOS開發中, 難免會集成別人的三方類庫, 當集成的三方類庫過多時, 難免會出現某些庫同時使用了同樣的函數庫,導致link的時候報錯提示duplicate symbol。詳情見圖:  

  這樣的報錯讓我們覺得很麻煩, 這樣的文件重覆錯誤, 不是由自己的程式中的代碼造成的, 而是別人的三方類庫, 也就是說,這種情況下, 我們沒有辦法通過修改自己的代碼而使問題得到解決。 我們就只能要求第三方(函數庫的提供方)提供源碼, 然後自己修改,或者是讓三方代碼提供者自己修改了之後給我們, 不管怎樣, 多少會覺得有點無理要求了。  那麼我們就只能想想辦法自己解決了, 也就是修改.a文件或者framework中的二進位文件。   修改這樣的錯誤, 我們需要用到lipo 和 ar 工具。 不知道用法的可以網上稍微搜索一下。   那麼我們現在就來修改一下吧。     一、找到重覆的庫文件(兩個庫文件重覆找其中之一即可, 三個庫文件, 找到重覆文件的其中兩個, .....以此類推),你可以直接在該項目下的文件夾進行操作(不建議, 容易使程式出問題),你也複製這些庫文件到其它文件夾進行操作。我們這裡複製到其它文件夾下進行操作。需要複製的文件見圖:

  二、打開終端, 並cd 到文件夾下, 使用  lipo -info    ASIAIDCardReader (ASIAIDCardReader替換為自己的文件名稱)查看該文件下的架構信息, 留待後用     三、我們可以看最後一行信息, 此處 Architecturesin the fat file, 說明此處是一個fat文件, 我們需要對該文件先進行瘦身, 即分離出armv7、arm64和armv7s文件。    使用命令 lipo ASIAIDCardReader -thin armv7-output ASIAIDCardReader.armv7 (ASIAIDCardReader.armv7 中ASIAIDCardReader 可替換為自己的文件名稱,且該名稱可以自定義), 使用類似的方法(只需要將 .armv7修改為相應的架構信息尾碼即可),分離出其它的文件  

四、文件已經分離出來, 下麵我們使用ar 工具, 查看各文件下的二進位文件(.o文件)。 此處我們可以使用 ar -t在終端中查看所有的.o文件

 也可以使用 ar -x將所有.o文件分離到指定的目錄文件夾。

根據我們最開始的錯誤定位,從上面我們都能輕易找到重覆的文件 AsyncSocket.o和AsyncSocket相關的文件,接下來就是對分離出來的文件進行修改了。     五、使用命令 ar -d -sv ASIAIDCardReader.armv7s AsyncSocket.o,即刪除ASIAIDCardReader.armv7s下的 AsyncSocket.o二進位文件(你只需要替換成你自己的庫文件名稱和.o文件即可),同樣對分離出來的.arm64、.armv7s進行同樣的操作。   

  六、文件修改好了, 接下來我們需要把修改好的文件,全部再組合成我們原來的framework下的fat文件。使用命令   lipo-create -output ASIAIDCardReaderASIAIDCardReader.armv7sASIAIDCardReader.arm64 ASIAIDCardReader.armv7(此處需要把所有分離出來的文件都加上) 為了使我們確認還原了ASIAIDCardReader文件, 我們將複製文件夾下的該文件刪除, 再進行操作。使用命令之後, 我們就能看到生成了一個新的 ASIAIDCardReader文件, 這就是我們修改之後,符合我們需求的文件了。    七、將修改好的文件, 拖拽到原文件夾下,替換原文件即可。    註:其它由重覆的framework, 按照以上方法重覆一遍即可。   好了, 按照這樣的方法, 我解決了自己的問題, 有什麼不對的地方, 還希望大家多多指點, 最後,此教程藉助博客:http://angelolloqui.com/blog/31-How-to-fix-a-Duplicated-Symbols-error-on-binary-files
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.在使用單例模式時一般使用allocWithZone 因為alloc最終還是會調用allocWithZone進行分配空間 ...
  • 【Objective-C Runtime動態載入】 動態創建類Class 動態創建類Class,動態添加Class成員變數與成員函數,動態變數賦值與取值,動態函數調用等方法 a.使用objc_allocateClassPair創建一個類Class const char * className = " ...
  • 什麼是主線程? 一個iOS程式運行後,預設會開啟一條線程,稱為“主線程”或“UI線程” 主線程的主要作用 1.顯示/刷新UI界面 2.處理UI事件(比如點擊事件,滾動事件,拖拽事件) 主線程的使用註意 1.別將比較耗時的操作放在主線程中 2.耗時操作會卡在主線程中,嚴重影響UI的流暢程度 如圖,將耗 ...
  • DrawerLayout是V4包下提供的一種左滑右滑抽屜佈局效果。 實現效果如下: 因為是官方提供的,所以使用起來也相對的比較簡單。 DrawerLayout 提供 1、當界面彈出的時候,主要內容區會自動背景變黑,當點擊內容區的時候,抽屜佈局會消失 2、在屏幕邊緣手勢滑動 會拉出抽屜佈局 註意:當按 ...
  • 圖片輪播是一種常見的自定義控制項,也有多種實現的方法,這裡提供一種簡單的ViewPager實現的案例。 實現功能:圖片迴圈輪播,進度顯示,圖片點擊事件 實現只需三步: 1 添加類文件到項目中。 2 在xml佈局中引入標簽。 3 實例化並設置簡單參數。 具體使用方法,詳見代碼註釋。 ==========... ...
  • 1.先來看看效果,這裡做了三個功能 2.實現app之間的跳轉需要註意兩方面 3首先來講url和白名單的設置 4.實現跳轉的代碼 5.demo:https://github.com/TigerCui/MyAppJumpToYourApp.git ...
  • 在學習多線程之前需要瞭解什麼是進程? 進程是指在系統中正在運行的一個應用程式 每個進程之間是獨立的,每個進程均運行在其專用且受保護的記憶體空間內 可以通過“活動監視器”查看Mac中所開啟的進程 下一個問題什麼是線程? 一個進程想要執行任務,必須得有線程(每一個進程只收要有一個主線程) 一個進程中的所有 ...
  • 什麼是讀寫鎖 讀寫鎖是多線程下的一種同步機制, 它還有很多其他的名字,比如共用 獨占鎖等等。被它保護的資源有以下幾種狀態: 初始狀態 沒有線程訪問資源時所在的狀態 共用狀態 有多個讀線程訪問資源時進入共用狀態,這個時候允許新的讀線程訪問資源,但是寫線程必須等待 獨占狀態 寫線程訪問資源時進入獨占狀態 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...