2013-10-09 18 views
22

Yerel iOS uygulamasında üçüncü parti çerçeveleri kullanıyorum (.a kitaplıkları grubu). Uygulamam XCode 5 base SDK 7.0 ile geliştirilmiştir.Dağıtım hedefi olduğunda mimarlık hatası için tanımlanmamış semboller 7.0

Kütüphaneler, dağıtım hedefi 6.1 olduğunda kütüphaneyi derler ve bağlar (kitaplık ve üstbilgi arama yolları iyidir). Ben dağıtım hedefini değiştirmek Ancak, 7.0 olmak gerekirse, aşağıdaki bağlayıcı hatayı alıyorum:

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) 
     ... 

Kütüphaneler, biraz eski bir uyumsuzluk sorunu olup olmadığından emin değilim. IOS 6'yı desteklemeyi planlamıyorum, bu nedenle dağıtım hedefini 7.0 olarak ayarlamam gerekiyor. Her türlü yardım/yön harika olurdu.

+0

bu i386 için derlenmiş alıyorsanız bir nedeni çözüldü? Sanırım i386'yı hedef kurulum ayarlarından kaldırmanız gerekiyor, böylece sadece armv7 ve armv7'ler var. – Justin

+0

Mimarlarla oynamayı denedim. Mimarlık meselesi olduğunu düşünmüyorum. Bu arada, kütüphaneler sadece armv7'yi destekliyor, bu yüzden armv7'ler sorunun dışında kalıyor. – Guven

+0

Seni duyuyorum, ama hatanın en üstünde, mimarlık i386 diyor. Görünüşe göre bu, ya :-) – Justin

cevap

27

XCode projede herhangi bir C++ dosyası bulamazsa, libstd ++'nin gerekli olmadığını varsayar. Yani, projeye bir C++ dosyası el ile eklemelisiniz (boş bir .mm dosyası yeterli olacaktır). Çözüm budur.

Tüm bu krediler, Stackoverflow thread numaralı telefona bu answer numarasına gider. dahil benim için

+0

Voodoo şeyleri! Benim için çalıştı – MartinMoizard

+0

Ayrıca, herhangi bir C++ başlık #import .pch dosyasına eklerseniz çalışır. – ETech

+1

Vay. Bu hala XCode 6.1.1'de bir problem ve bu çözüm hala çalışıyor. Muz. Cevabı buraya koyduğunuz için teşekkürler! – Kelly

8

myLibrary.a, C++ koduyla yapılan çağrılar ile oluşturulmuş ve C++ standart kitaplığı olarak libstdC++ kullanılmış gibi görünüyor. Uygulama projeniz büyük olasılıkla, derleyici varsayılanı olarak libC++ değerini belirtir.

LibstdC++ uygulamasına geri dönmeyi ve hataların giderilip giderilmediğini (veya en azından değiştirmeyi) deneyin. Sizin nihai çözümünüz yeni standart kütüphaneye karşı inşa edilmiş bir kütüphane olabilir.

+0

Bunu işaretlediğiniz için teşekkürler, ama hayır. Bu sorunu çözmez. Aslında kütüphaneden 'libC++ abi.dylib: handler istisnası' açıklamasıyla hatalar almayı hatırlıyorum. Yani, kütüphanenin libC++ ile derlendiğini tahmin ediyorum. – Guven

+0

Büyük teşekkürler Philip benim günümü kurtardın – Feras

45

, 'stdC++. 6.0.9.dylib' yerine 'stdC++. dylib' bağımlılıkları içine bağlayıcı hataları da

+0

Bu sorunu çözdü. Teşekkürler! Bu iki kütüphane arasındaki fark nedir? –

+0

Doğrudan bir kütüphane belirterek, 'optimizasyon' için Xcode mantığını atlar ve projenin C++ kaynak dosyaları içerip içermediğini kontrol eder – Denis

+0

Bu, benim için de problemi çözdü - boş C++ dosyaları eklemek zorunda kalmadan. –

İlgili konular