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.
Merci!
#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.
A partir d'un projet d'application "vide":
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.
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
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.
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.
Liez votre application à la bibliothèque standard C++ en ajoutant -lc++
au paramètre Autres indicateurs de l'éditeur de liens build.
Importez l'en-tête dans vos fichiers comme suit:
#import <ThirdParty/third_party.hh>
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.
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.