Подтвердить что ты не робот

Undefined символы для ошибки архитектуры при достижении цели развертывания 7.0

Я использую сторонние фреймворки в своем родном приложении iOS (куча библиотек .a). Мое приложение разработано с базовым SDK 7.0 для XCode 5.

Библиотеки компилируют и связывают штрафы, когда целью развертывания является 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. Любая помощь/направление будет отличной.

4b9b3361

Ответ 1

Оказывается, если XCode не может найти в проекте какие-либо файлы на С++, то предполагается, что libstd ++ не требуется. Итак, вам нужно вручную добавить в проект файл С++ (достаточно будет пустого файла .mm). Это решение.

Все кредиты идут на этот ответ в этом fooobar.com/questions/194675/....

Ответ 2

для меня, в том числе " stdС++. 6.0.9.dylib" вместо " stdС++. dylib" ) в зависимостях также устранены ошибки компоновщика

Ответ 3

Похоже, что myLibrary.a был создан с вызовами кода С++ и использовал libstdС++ в качестве стандартной библиотеки С++. Возможно, ваш проект приложения указывает на libС++, возможно, как на компилятор по умолчанию.

Попробуйте вернуться к libstdС++ и посмотреть, исчезли ли ошибки (или, по крайней мере, изменились). Возможно, ваше возможное решение будет библиотекой, созданной против новой стандартной библиотеки.