Símbolos indefinidos para error de arquitectura cuando el destino de implementación es 7.0


Estoy utilizando marcos de terceros en mi aplicación nativa de iOS (montón de .biblioteca). Mi aplicación está desarrollada con XCode 5 base SDK 7.0.

Las bibliotecas se compilan y enlazan bien cuando el destino de implementación es 6.1 (las rutas de búsqueda de bibliotecas y encabezados son buenas). Sin embargo, cuando cambio el destino de implementación a 7.0, obtengo el siguiente error de enlazador:

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

Las bibliotecas son un poco antiguas, no estoy seguro de si hay un problema de compatibilidad. No estoy planeando soportar iOS 6, así que necesidad de establecer el destino de implementación como 7.0. Cualquier tipo de ayuda / dirección sería genial.

Author: Guven, 2013-10-09

3 answers

Para mí, incluyendo el ' stdc++.6.0.9.dylib' en lugar de 'stdc++.dylib ' en las dependencias también resolvió los errores del enlazador

 46
Author: Denis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-02 11:05:34

Resulta que si XCode no puede encontrar ningún archivo C++ en el proyecto, entonces asume que libstd++ no es necesario. Por lo tanto, debe agregar manualmente un archivo C++ al proyecto (un archivo .mm vacío sería suficiente). Esa es la solución.

Todos los créditos van a esta respuesta en este hilo Stackoverflow.

 28
Author: Guven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:01:35

Parece MyLibrary.a fue construido con llamadas a código C++ y utilizó libstdc++ como su biblioteca estándar de C++. Su proyecto de aplicación probablemente especifique libc++ en su lugar, tal vez como el compilador predeterminado.

Intente cambiar de nuevo a libstdc++ y vea si los errores desaparecen (o cambian, al menos). Es probable que su solución final sea una biblioteca que se construya contra la nueva biblioteca estándar.

 8
Author: Phillip Mills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-09 12:53:24