Framework not found AFNetworking

weixin_34249678發表於2016-12-13

前段時間,接手新公司專案,發現換了電腦,svn下載程式碼,cocoapods以後,程式碼報錯。直接拷過來也報錯。於是就開始了漫長的除錯過程。

首先是pod install以後出現下面問題:

LKDBHelper報錯

1904531-c1457be89199491a.PNG

這是pods資料夾裡面的東西,出現這個問題就很奇怪了。然後就該考慮User Header Search Paths 與Header Search Paths的問題了。

首先要知道,Header Search Paths 顧名思義就是用來存放 Project 中標頭檔案的搜尋根源,沒有被add到專案裡的標頭檔案,可以通過配置Header Search Paths 來引入標頭檔案,這樣的好處可以不讓project 包含的檔案太多,便於管理。

也就是說,編碼時候通過 #import 引入標頭檔案的方式有兩種 <> 和 ""。<> 是隻從 Header Search Paths 中搜尋, 而 "" 則能從  Header Search Paths 和  User Header Search Paths 中搜尋。換言之 ,假如你把 路徑加到  User Header Search Paths 中,那麼 你用 #import的方式去引入對應的標頭檔案,就會報錯。 如果加到  Header Search Paths,  就沒有問題了。

具體一點的區別是,<> 是從系統目錄空間 (對應 Header Search Paths)中搜尋檔案, "" 是從使用者目錄空間(對應 User Header Search Paths)中搜尋檔案。如果你把路徑加到 User Header Search Paths 中,而 <> 無法從系統目錄空間中找到新加的路徑,從而報錯。

然後我解決了這個問題,但是問題來了報錯

Framework not found AFNetworking

這個問題還是真的比較難辦,看了一下Framework Search Paths 和Library Search Paths都沒啥問題。這個時候看了一個Build Active Architecture Only的屬性

1904531-ca422b82040a823c.png

然後我查了一下,答案都是一樣的,不知道誰是原創。就把內容整理出來吧。

Architectures

這代表,在這個專案裡你想要Xcode編譯的目標裝置列表。

Build Active Architecture Only

這個屬性設定為yes,是為了debug的時候編譯速度更快,它只編譯當前的architecture版本。

而設定為no時,會編譯所有的版本。

這個是裝置對應的architecture:

armv6:iPhone 2G/3G,iPod 1G/2G

armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G

armv7s:iPhone5, iPod5

arm64:iPhone5s,ipad air,ipad mini2

編譯出的版本是向下相容的,比如你設定此值為yes,用iphone4編譯出來的是armv7版本的,iphone5也可以執行,但是armv6的裝置就不能執行。

所以,一般debug的時候可以選擇設定為yes,release的時候要改為no,以適應不同裝置。



這裡是重點

你檢查一下你專案的pods裡的設定 和你工程的target的設定是否一樣

1904531-815230773376775b.png

我設定完了以後,專案就好了。。。如果你有什麼問題的話,可以留言我們一起探討一下。。

題外話:

1.$(SRCROOT) / $(PROJECT_DIR) 基本沒啥區別,都是指向*.xcodeproj所在的路徑

2.$(inherited): target 的Framework Search Paths新增$(inherited)引數會從PROJECT -> Build Settings -> Framework Search Paths裡面的路徑會被其繼承,沒有的話不會繼承。所以一個專案裡面有多個target,使用到了同一個庫(Library或Framework)那麼為了方便我們可以在target新增繼承引數,並且PROJECT統一中新增庫的路徑。繼承的優先順序:

  Platform defaults

  Project file (描述舉例用這個優先順序,比較常用)

  xcconfig file for the Project file

   Target

    xcconfig file for the Target

3.recursive:遍歷該目錄,non-recursive:預設路徑設定;不遍歷該目錄。如果路徑的屬性為recursive,那麼編譯的時候在找庫的路徑的時候,會遍歷該目錄下的所有子目錄的庫檔案。PS:在搭建專案的時候,可以建立一個專門放庫檔案的資料夾並且設定其屬性為recursive。$(PROJECT_DIR)/**相當於遍歷專案檔案同級下的所有路徑(不推薦使用,專案大的話,影響編譯的速度)。

4.解決警告“ld: warning: directory not found for option”

   從專案中刪除了某個目錄、檔案以後,編譯出現警告資訊:

   ld: warning: directory not found for option“XXXXXX”

   很奇怪,為什麼已經從專案中刪除了檔案和資料夾還是報這個警告呢?

   去掉警告的辦法如下:

  1)選擇工程, 編譯的 (targets)

  2)選擇 Build Settings 選單

  3)查詢 Library Search Paths 和 Framework Search Paths, 刪掉編譯報warning的路徑即OK


總結:

在開發中不遇到這些問題,很難去注意。第一篇簡書。爬坡階段,希望能堅持下去……

相關文章