2013-06-26 60 views
1

我正在嘗試使用靜態庫(.a),我也有頭文件(沒有.m文件),但是當我添加該庫到我的目標(甚至沒有引用/導入我的項目代碼中的庫),我收到編譯時Undefined symbols for architecture armv7鏈接錯誤。鏈接器正在抱怨那些可能不再存在於最新版本庫中的類,並且可能正在使用緩存數據?如果我創建一個空白項目並以與將其添加到我的項目中的方式完全相同的方式添加庫,則可以支持這種懷疑,因此新項目編譯時沒有問題。但另一方面,當我grep我的文件系統的類/ ivars鏈接器抱怨,我在我的靜態庫文件和我的xcuserdata工作區文件夾中匹配。所以我想知道是否問題出現在我的項目中,我想要導入的庫,還是我嘗試將庫添加到項目中的方式?另外,爲什麼我甚至沒有從我的代碼中導入/調用庫時出現鏈接器錯誤?我正在使用XCode 4.6.1XCode將錯誤鏈接到緩存的庫信息而不被調用(未定義的體系結構符號)

的連接錯誤如下:

Undefined symbols for architecture armv7: 
"_OBJC_IVAR_$_GenericPopupView.delegateTheme", referenced from: 
    -[MyListView setDelegateTheme:] in myLib.a(MyListView.o) 
    -[MyListView tableView:cellForRowAtIndexPath:] in myLib.a(MyListView.o) 
"_OBJC_CLASS_$_SampleMarkView", referenced from: 
    objc-class-ref in myLib.a(MyListView.o) 
"_OBJC_CLASS_$_CheckMarkView", referenced from: 
    objc-class-ref in myLib.a(MyListView.o) 
"_OBJC_METACLASS_$_GenericPopupView", referenced from: 
    _OBJC_METACLASS_$_MyListView in myLib.a(MyListView.o) 
"_OBJC_CLASS_$_GenericPopupView", referenced from: 
    _OBJC_CLASS_$_MyListView in myLib.a(MyListView.o) 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我通過執行以下步驟中添加的庫我的目標:

  1. 在我的項目上單擊右鍵
  2. 選擇'Add Files to "My Project"'
  3. 通過彈出式Finder窗口找到.a文件
  4. 驗證li brary路徑是在我Target -> Build Settings -> Library Search Paths(自動添加,當我完成步驟3)
  5. 添加頁眉目錄Target -> Build Settings -> Header Search Paths
  6. 驗證庫在Target -> Build Phases -> Link Binary With Libraries
  7. 驗證庫通過file編譯armv7上市, otool,& lipo(聽說圖書館也可以包括armv6s,但我沒有看到armv6當我用三個命令)

    $ file myLib.a 
    myLib.a: Mach-O universal binary with 2 architectures 
    myLib.a (for architecture armv7): current ar archive random library 
    myLib.a (for architecture cputype (12) cpusubtype (11)): current ar archive random library 
    
    $ otool -L myLib.a 
    Archive : myLib.a (architecture cputype (12) cpusubtype (11)) 
    … 
    
    $ lipo -info myLib.a 
    Architectures in the fat file: myLib.a are: armv7 (cputype (12) cpusubtype (11)) 
    

這件事情我已經試過其間的每個編譯嘗試沒有成功:

  • 乾淨(蘋果)+ SHIFT + K
  • 清潔生成目錄(DerivedData)(蘋果)項目+ Alt + Shift + K
  • 刪除所有DerivedData目錄的命令行
  • 刪除和存儲庫,它的頭文件重新添加到我的項目
  • 庫沒有頭
  • 把庫中的一個項目,是一個目標,而不是依賴於我的項目直接
    • 注意,我無法將庫添加爲在Build SettingsTarget Dependency;我應該能夠嗎?
    • 我也無法將庫添加到目標的Build Scheme(通過的XCode菜單的Product -> Scheme -> Edit Scheme... -> Build -> +
  • 檢查Build Settings通過iOS Deployment Target最小的iOS版本 - 無論是我的目標和圖書的iOS 6.0
  • 刪除了除我的項目所需的所有目標搜索路徑(不包括下面顯示的新庫)(最重要的是我從鏈接器路徑中刪除了DerivedData);我的整個項目生成設置(不是目標的構建設置)中沒有其他的搜索路徑

    頭搜索路徑

    $(BUILT_PRODUCTS_DIR)/usr/local/include 
    $(SRCROOT)/../MyLibDirectory/headers 
    

    庫搜索路徑

    $(inherited) 
    $(SRCROOT)/../TargetDependencyDirectory 
    $(SRCROOT)/../openssl/lib 
    $(SRCROOT)/../MyLibDirectory 
    
  • 取消了對圖書館的所有其他實例我的機器(舊版本)

  • 設置用戶定義的版本設置USE_HEADERMAP = NO
  • 新成像機器上一個新的項目結帳安裝和重複所有上述步驟
  • 添加–ObjC++其他連接標誌(-ObjC已經是一個鏈接標誌)本身並與在armv6
  • 使用armv6sValid ArchitectureBuild Settings爲我的目標下,目標依賴
  • 設置Build Active Architecture OnlyYes
  • 在父項目組級別添加庫項目組對之間切換
  • 從圖書館在我的項目代碼
  • Utilities窗口Identity and Type下與Location圖書館的不同設置,演奏在XCode的右側添加對象的進口和實例選擇了庫時
  • 添加通過+然後Add Other...

庫爲目標的Build Phases -> Link Binary With Libraries我已經嘗試在這些和其他職位的建議步驟(只列出了這些最後兩個具有實際指導):

我沒有試圖改變我所有的文件.mm(我並不需要爲以前這個庫的版本),但我有很多.m文件,我認爲可能會破壞if我改變他們所有...

任何幫助或succestions非常感謝!我真的很難搞清楚爲什麼這個新版本的庫會給我帶來麻煩。

回答

0

我解決了自己的問題,或者更確切地說,問題出在我包括的圖書館的黑盒子上。

grep SampleMarkView myLib.a 

這就造成了:在命令行中的一個終端窗口中執行以下命令

Binary File:myLib.a matches 

我跟誰創造了圖書館的人,他們給我發了一個更新的版本,沒」不會導致問題 - 我猜他們在代碼中有舊的引用。所以,至少我希望這篇文章提供了一系列可以嘗試的東西,如果你有一個庫引用問題!

相關問題