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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...