Uso de encabezados de C ++ externos en Objective-C

En mi proyecto iOS, necesito usar una biblioteca externa escrita en C ++. Los files de cabecera de C ++ están todos en un directory.

Agregué estos encabezados de C ++ a mi proyecto Xcode y también especificé una ruta de búsqueda de encabezado (en Configuración de compilation).

El problema es que estos encabezados de C ++ se incluyen entre sí usando <> corchetes angulares. Esto resulta en:

'filename.h' file not found with <angled> include, use "quotes" instead. 

Lo extraño es que Xcode no se queja de todos los encabezados. También el mismo encabezado # incluido en un file está bien, mientras que un problema cuando # se incluye en otro. Creo que esto es causado por el hecho de que estos encabezados #include uno al otro.

  1. ¿Por qué no funciona la ruta de búsqueda?
  2. ¿Hay alguna manera de resolver esto sin modificar estos files de encabezado?

¡Gracias!

 #include <bla.h> 

está destinado a los encabezados de biblioteca o marco estándar, y la estrategia de búsqueda es diferente a la utilizada para

 #include "bla.h" 

Ver por ejemplo

  • ¿Cuál es la diferencia entre #include <filename> y #include "filename"?

Como solución, puede establecer la configuration de compilation Xcode "Siempre search routes de usuario" en SÍ.

A partir de un proyecto de aplicación "en blanco":

  1. Cree una carpeta "Bibliotecas" en el proyecto de su aplicación, preferible como hermano de su file MyApp.xcodeproj, pero puede estar en cualquier lugar. Cree subcarpetas para cada Configuración (Depuración, Liberación, etc.) y, posiblemente, para cada architecture (armv7, armv7s, arm64) a less que el binary sea un file binary universal que contenga todas las architectures.

  2. Obtenga los encabezados de la biblioteca de terceros y los files binarys de la biblioteca estática (posiblemente más de uno para diferentes plataforms, configuraciones y architectures) y muévalos a la carpeta "Biblioteca" en las subcarpetas correspondientes (que puede necesitar crear):

    Por ejemplo, suponiendo que tenía una versión binaria universal (armv7, armv7s, arm64) y versiones de debugging de esa biblioteca: ahora, se supone que la estructura de la carpeta es la siguiente:

     $(SRCROOT)/Libraries Debug-iphoneos include ThirdParty third_party.hh ... libThirdParty.a Release-iphoneos include ThirdParty third_party.hh ... libThirdParty.a MyApp.xcodeproj 
  3. "Rutas de búsqueda de biblioteca" Configuración de compilation:

    Arrastra la carpeta "Bibliotecas" a tu proyecto Xcode. Esto puede crear automáticamente una ruta de búsqueda de biblioteca en la configuration de compilation. Verifique esto y, si no es correcto, corríjalo.

    Dado el ejemplo, agregue las siguientes routes de búsqueda de bibliotecas para la configuration de debugging y lanzamiento:

    Debug: Rutas de búsqueda de biblioteca : $(SRCROOT)/Libraries/Debug-iphoneos

    Versión: Rutas de búsqueda de biblioteca : $(SRCROOT)/Libraries/Release-iphoneos

    Es posible que tenga diferentes routes de búsqueda de bibliotecas para pares de plataforms particulares de configuration y destino. Establezca diferentes routes en la configuration de compilation en consecuencia.

  4. "Rutas de búsqueda de encabezado" Configuración de compilation:

    Dado el ejemplo, agregue la siguiente ruta de búsqueda de encabezado a la debugging y la configuration de la versión:

    Debug: Rutas de búsqueda del encabezado : $(SRCROOT)/Libraries/Debug-iphoneos/include

    Versión: Rutas de búsqueda del encabezado : $(SRCROOT)/Libraries/Release-iphoneos/include

    Del mismo modo, puede tener diferentes routes para pares específicos de configuration / destino, aunque los encabezados pueden ser iguales.

  5. Vincule su aplicación con la biblioteca estándar de C ++ agregando -lc++ a la configuration de compilation de Otros indicadores de -lc++ .

  6. Importe el encabezado en sus files de la siguiente manera:

      #import <ThirdParty/third_party.hh> 

En XCode después de configurar las "Rutas de búsqueda del encabezado de usuario" para apuntar al directory de su biblioteca, también debe asegurarse de que un campo llamado "Siempre search routes de usuario" esté configurado en "Sí"

Esto resolvió el problema que estaba teniendo: con el file <boost / signals2.hpp> no encontrado con <angled> include, use "quotes" en su lugar.