2013-10-09 24 views
22

我在本機iOS應用程序(一堆.a庫)中使用第三方框架。我的應用程序是使用XCode 5 SDK SDK 7.0開發的。當部署目標爲7.0時,架構錯誤的未定義符號

當部署目標爲6.1(庫和標頭搜索路徑很好)時,庫編譯並鏈接正常。但是,當我改變了部署目標爲7.0,我得到下面的連接錯誤:

Undefined symbols for architecture i386: 
    "std::string::find_last_of(char const*, unsigned long) const", referenced from: 
     GetExecutionDir(ECTemplateString<char>&, char*, bool) in myLibrary.a(moPlatForm.o) 
    "std::string::find(char const*, unsigned long) const", referenced from: 
     ParseLog(std::string const&, unsigned int&, CmoDateTime&, int&, std::string&) in myLibrary.a(AppLog.o) 
    "std::string::size() const", referenced from: 
     mo::CmoParam::WriteToStream(void*, mo::STREAM_STATE*) in myLibrary.a(moParams.o) 
    "std::string::c_str() const", referenced from: 
     GetExecutionDir(ECTemplateString<char>&, char*, bool) in myLibrary.a(moPlatForm.o) 
     CMocaFileTransfer::UpdateParamsForGetTraceFiles(mo::CmoParamList&, long) in myLibrary.a(RobieFileTransfer.o) 
     CMocaFileTransfer::AddTraceFileForUpload(std::string const&, std::string const&) in myLibrary.a(RobieFileTransfer.o) 
     CMocaFileTransfer::CreateParamsForSendTraceFiles(mo::CmoObject&) in myLibrary.a(RobieFileTransfer.o) 
     mo::CmoParam::WriteToStream(void*, mo::STREAM_STATE*) in myLibrary.a(moParams.o) 
     ParseLog(std::string const&, unsigned int&, CmoDateTime&, int&, std::string&) in myLibrary.a(AppLog.o) 
     CAppLog::LogExists(unsigned int) in myLibrary.a(AppLog.o) 
     ... 

圖書館是有點老了,我不知道是否有兼容性問題。我不打算支持iOS 6,所以我需要將部署目標設置爲7.0。任何形式的幫助/指導都會很棒。

+0

任何理由爲什麼這些越來越編譯的i386?我猜你需要從目標版本設置中刪除i386,所以只有armv7和armv7s在那裏。 – Justin

+0

我曾嘗試玩過架構。我不認爲這是一個架構問題。順便說一句,圖書館只支持armv7,所以armv7s是不可能的。 – Guven

+0

我聽到雅,但在錯誤的頂部它說架構i386。顯然它不支持這一點:-) – Justin

回答

27

事實證明,如果XCode在項目中找不到任何C++文件,那麼它假定不需要libstd ++。所以,你必須手動添加一個C++文件到項目中(一個空的.mm文件就足夠了)。這是解決方案。

所有學分轉到此answer在此Stackoverflow thread

+0

巫毒之物!爲我工作 – MartinMoizard

+0

如果您將任何C++頭文件#import添加到.pch文件,它也可以工作。 – ETech

+1

哇。這仍然是XCode 6.1.1中的一個問題,並且此解決方案仍然有效。香蕉。謝謝你把答案也放在這裏! – Kelly

8

看起來好像myLibrary.a是通過調用C++代碼構建的,並使用libstdC++作爲其C++標準庫。您的應用程序項目可能會指定libC++,而不是編譯器默認值。

嘗試切換回libstdC++並查看錯誤是否消失(或至少更改)。您的最終解決方案可能是針對新標準庫構建的庫。

+0

感謝您指出這一點,但不是。這不能解決問題。實際上,我記得從庫中得到的錯誤與描述'libC++ abi.dylib:處理程序拋出異常'。所以,我猜這個庫是用libC++編譯的。 – Guven

+0

非常感謝菲利普你救了我一天 – Feras

45

對我來說,包括「STDC++。6.0.9.dylib」而不是「STDC++。dylib」到依賴性解決了鏈接錯誤太

+0

解決了這個問題。謝謝!這兩個庫有什麼區別? –

+0

我相信,直接指定一個庫,跳過Xcode邏輯'優化',並檢查項目是否包含C++源文件。 – Denis

+0

這也解決了我的問題 - 無需添加任何空的C++文件。 –

相關問題