2013-07-04 8 views
11

In meinem iOS-Projekt muss ich eine externe Bibliothek in C++ geschrieben verwenden. Die C++ - Headerdateien befinden sich alle in einem Verzeichnis.Verwendung von externen C++ - Header in Objective-C

Ich habe diese C++ - Header zu meinem Xcode-Projekt hinzugefügt und auch einen Header-Suchpfad (in Build-Einstellungen) angegeben.

Das Problem ist, dass diese C++ - Header einander über <> spitze Klammern enthalten. Dies ergibt:

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

Das komische Ding ist, dass Xcode nicht über alle Überschriften meckert. Auch die gleiche Kopfzeile, die in einer Datei enthalten ist, ist in Ordnung, während ein Problem, wenn # in einer anderen enthalten ist. Ich denke, das liegt daran, dass sich diese Header #einschließen.

  1. Warum funktioniert der Suchpfad nicht?
  2. Gibt es eine Möglichkeit, dies zu beheben, ohne diese Headerdateien zu ändern?

Vielen Dank!

+0

Haben Sie die Quellen und das Xcode-Projekt dieser C++ - Bibliothek? – CouchDeveloper

+0

@CouchDeveloper Nein, tue ich nicht. –

+4

Hilft das Einstellen der Build-Einstellung "Always Search User Paths"? –

Antwort

26
#include <bla.h> 

ist für Standard-Bibliothek oder Rahmen-Header gemeint, und die Suchstrategie Ist anders als die verwendet für

#include "bla.h" 

für Siehe Beispiel

Als Workaround können Sie t einstellen Die Xcode-Build-Einstellung "Benutzerpfade immer durchsuchen" auf JA setzen.

+1

Beachten Sie, dass die Einstellung "Immer Benutzerpfade durchsuchen" zu JA führen kann. Es wird dringend empfohlen, es auf NEIN zu setzen, und das ist der richtige Weg. Es ist immer noch nur für Rückwärtskompatibilitäten da. Die Header der Third-Party-Bibliothek sollten in spitze Klammern eingeschlossen werden. – CouchDeveloper

+0

@CouchDeveloper: Es war als Workaround gedacht, aber Sie haben Recht und Ihre Antwort ist wahrscheinlich die bessere Lösung. –

+0

@CouchDeveloper stimmen zu, dass diese Einstellung auf NO gesetzt werden sollte, aber ist es unerwünscht, diese Einstellung im Kontext der Erstellung eines eingebetteten Frameworks auf YES zu setzen? –

11

Ausgehend von einem „leeren“ Anwendungsprojekt:

  1. Erstellen Sie einen Ordner „Bibliotheken“ in Projekt Ihrer Anwendung - bevorzugt als Geschwister zu Ihrer MyApp.xcodeproj Datei, aber es kann überall sein. Erstellen Sie Unterordner für jede Konfiguration (Debug, Release usw.) und möglicherweise für jede Architektur (armv7, armv7s, arm64), es sei denn, die Binärdatei ist ein universelles Binärarchiv, das alle Architekturen enthält.

  2. Holen Sie sich die Header der Third-Party-Bibliothek und die statischen Bibliotheksbinärdateien (möglicherweise mehr als eins für verschiedene Plattformen, Konfigurationen und Architekturen) und verschieben Sie sie in den Ordner "Library" in entsprechende Unterordner (die Sie möglicherweise erstellen müssen)):

    zum Beispiel, vorausgesetzt, Sie eine universal binary hatte (ARMv7, armv7s, arm64) und Debug und Release-Versionen dieser Bibliothek: Nun wird die Ordnerstruktur übernommen werden, wie folgt:

    $(SRCROOT)/Libraries 
        Debug-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
        Release-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
    MyApp.xcodeproj    
    
  3. "Bibliothek Suchpfade" Build Se tting:

    Ziehen Sie den Ordner "Bibliotheken" in Ihr Xcode-Projekt. Dieser kann automatisch einen Bibliothekssuchpfad in den Erstellungseinstellungen erstellen. Bitte überprüfen Sie dies, und wenn es nicht korrekt ist, beheben Sie es.

    das Beispiel, fügen Sie die folgenden Bibliothekssuchpfade für Debug und Release-Konfiguration Gegeben:

    Debug: Bibliothek Suchpfade: $(SRCROOT)/Libraries/Debug-iphoneos

    Release: Bibliothek Suchpfade: $(SRCROOT)/Libraries/Release-iphoneos

    Sie haben möglicherweise unterschiedliche Bibliothekssuchpfade für bestimmte Configuration- und Target-Plattformpaare. Legen Sie in der Build-Einstellung entsprechend unterschiedliche Pfade fest.

  4. "Header-Suchpfade" Build Rahmen:

    das angegebene Beispiel des folgenden Header-Suchpfad zu dem Debug und Release-Konfiguration hinzufügen:

    Debug: Header-Suchpfade: $(SRCROOT)/Libraries/Debug-iphoneos/include

    Release: Header-Suchpfade: $(SRCROOT)/Libraries/Release-iphoneos/include

    Sie können auch unterschiedliche Pfade für bestimmte Config/Target-Paare haben - obwohl die Header identisch sein können.

  5. Link zum App gegen die C++ Standardbibliothek von -lc++ zur Anderen Linker Flags build Einstellung hinzuzufügen.

  6. Import der Header in Ihre Dateien wie folgt:

    #import <ThirdParty/third_party.hh> 
    
+0

Das hat geholfen, da dieser Fehler in meinem Fall zielabhängig war. –

+0

Episch, zum ersten Mal kann ich den Winkel mit einer 3rd-Party-Bibliothek arbeiten lassen, die ich in meinem Projekt habe, weil ich es patchen möchte. Vielen Dank. – aledalgrande

1

In XCode nach dem „User Header-Suchpfade“ -Einstellung auf Ihrer Bibliothek Verzeichnis zeigen, Sie müssen auch sicherstellen, dass ein Feld gesetzt „Always Suche Benutzerpfade“ genannt wird, mit „Ja“

Dies löste das Problem ich mit war: mit <boost/signals2.hpp> Datei mit nicht gefunden <abgewinkelte> enthalten, verwenden Sie „Anführungszeichen“ stattdessen.

1

In Xcode 9 muss ich Header-Dateien Pfad zur Header Search Paths Build-Einstellung hinzufügen, nicht User Header Search Paths.

Xcode wird User Header Search Paths anhängen Befehl als -iquote Optionen zu kompilieren, aber Header Search Paths als -I Optionen anhängen. Das ist der Hauptunterschied.

+0

Vielen Dank, dass Sie darauf hingewiesen haben. (Ich hatte keine Zeit, es zu überprüfen, aber ich vertraue dir.) –

Verwandte Themen