web-dev-qa-db-fra.com

Utilisation d'en-têtes C++ externes dans Objective-C

Dans mon projet iOS, je dois utiliser une bibliothèque externe écrite en C++. Les fichiers d'en-tête C++ sont tous dans un répertoire.

J'ai ajouté ces en-têtes C++ à mon projet Xcode et également spécifié un chemin de recherche d'en-tête (dans les paramètres de construction).

Le problème est que ces en-têtes C++ s’incluent mutuellement en utilisant des crochets <>. Cela se traduit par:

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

La chose étrange est que Xcode ne se plaint pas de tous les en-têtes. De même, le même en-tête # inclus dans un fichier convient, alors que le problème est # inclus dans un autre. Je pense que cela est dû au fait que ces en-têtes se comprennent mutuellement.

  1. Pourquoi le chemin de recherche ne fonctionne-t-il pas?
  2. Est-il possible de résoudre ce problème sans modifier ces fichiers d'en-tête?

Merci!

18
meaning-matters
#include <bla.h>

est destiné aux en-têtes standard de bibliothèque ou de cadre, et la stratégie de recherche est différente de celle utilisée pour 

#include "bla.h"

Voir par exemple 

Pour contourner le problème, vous pouvez définir le paramètre de construction Xcode "Toujours rechercher les chemins utilisateur" sur YES.

32
Martin R

A partir d'un projet d'application "vide":

  1. Créez un dossier "Bibliothèques" dans le projet de votre application - de préférence en tant que frère de votre fichier MyApp.xcodeproj, mais il peut être n'importe où. Créez des sous-dossiers pour chaque configuration (Debug, Release, etc.) et éventuellement pour chaque architecture (armv7, armv7s, arm64) sauf si le fichier binaire est une archive binaire universelle contenant toutes les architectures.

  2. Obtenez les en-têtes de la bibliothèque tierce et les fichiers binaires de la bibliothèque statique (éventuellement plusieurs pour différentes plates-formes, configurations et architectures) et déplacez-les dans le dossier "Library" dans les sous-dossiers correspondants (que vous devrez peut-être créer):

    Par exemple, en supposant que vous disposiez d'une version universelle (armv7, armv7s, arm64) et des versions Debug et Release de cette bibliothèque: La structure de dossier est supposée être la suivante:

    $(SRCROOT)/Libraries
        Debug-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
        Release-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
    MyApp.xcodeproj            
    
  3. Paramètre de construction "Chemins de recherche de bibliothèque":

    Faites glisser le dossier "Bibliothèques" dans votre projet Xcode. This may crée automatiquement un chemin de recherche de bibliothèque dans les paramètres de construction. Veuillez vérifier cela et, s'il n'est pas correct, corrigez-le.

    Dans cet exemple, ajoutez les chemins de recherche de bibliothèque suivants pour la configuration de débogage et de publication:

    Débogage: Chemins de recherche dans la bibliothèque : $(SRCROOT)/Libraries/Debug-iphoneos

    Version: Chemins de recherche dans la bibliothèque : $(SRCROOT)/Libraries/Release-iphoneos

    Vous pouvez avoir différents chemins de recherche de bibliothèque pour des paires de plates-formes Configuration et Cible particulières. Définissez les différents chemins dans les paramètres de construction en conséquence.

  4. Paramètre de construction "Chemins de recherche d'en-tête":

    Dans cet exemple, ajoutez le chemin de recherche d’en-tête suivant à la configuration de débogage et de libération:

    Débogage: Chemins de recherche d'en-tête : $(SRCROOT)/Libraries/Debug-iphoneos/include

    Version: Chemins de recherche d’en-tête : $(SRCROOT)/Libraries/Release-iphoneos/include

    De même, vous pouvez avoir des chemins différents pour des paires Config/Target particulières - bien que les en-têtes puissent être les mêmes.

  5. Liez votre application à la bibliothèque standard C++ en ajoutant -lc++ au paramètre Autres indicateurs de l'éditeur de liens build.

  6. Importez l'en-tête dans vos fichiers comme suit:

     #import <ThirdParty/third_party.hh>
    
13
CouchDeveloper

Dans Xcode 9, je dois ajouter le chemin d'accès aux fichiers d'en-tête dans le paramètre de construction Header Search Paths, et non pas User Header Search Paths.

Xcode ajoutera User Header Search Paths pour compiler la commande en tant qu'options -iquote, mais ajoutera Header Search Paths en tant qu'options -I. C'est la principale différence.

3
Piasy

Dans XCode, après avoir défini les "chemins de recherche d'en-tête d'utilisateur" pour qu'ils pointent vers le répertoire de votre bibliothèque, vous devez également vous assurer qu'un champ appelé "toujours rechercher les chemins d'utilisateur" est défini sur "oui".

Cela a résolu le problème que je rencontrais: avec le fichier <boost/signs2.hpp> introuvable avec <angle> include, utilisez "quotes" à la place.

0
Donovanr