Alternative Titel zur Unterstützung der Suche
- Xcode kann Header nicht finden
- Fehlende .h in Xcode
- Xcode .h Datei nicht gefunden
- lexikalische oder Präprozessor-Problemdatei nicht gefunden
Ich arbeite an einem iOS-Anwendungsprojekt, das von Xcode 3 stammt. Ich bin jetzt zu Xcode 4 übergegangen. Mein Projekt erstellt eine Reihe statischer Bibliotheken.
Diese statischen Bibliotheken deklarieren auch öffentliche Header, und diese Header werden vom Anwendungscode verwendet. In Xcode 3.x wurden die Header (als Build-Phase) in das kopiert public headers directory
, dann wurde im Anwendungsprojekt das public headers directory
in das hinzugefügt headers search list
.
Unter Xcode 4 wird das Build-Verzeichnis verschoben ~/Library/Developer/Xcode/DerivedData/my-project
.
Das Problem ist, wie ich in den Einstellungen für die Headersuche auf diesen neuen Speicherort verweise. Es scheint, dass:
public headers directory
ist relativ zumDerivedData
Verzeichnis, aberheaders search
Verzeichnis ist relativ zu etwas anderem (möglicherweise dem Projektspeicherort)
Wie sollte ich in Xcode 4 ein statisches Bibliotheksziel für die iOS-Entwicklung einrichten, das sicherstellt, dass die Header-Dateien den Clients zur Verfügung gestellt werden, die die statische Bibliothek verwenden, wenn sie versuchen, als Abhängigkeit zu kompilieren?
quelle
Antworten:
Jede der Lösungen, die ich für dieses Problem gesehen habe, schien entweder unelegant (Kopieren von Headern in das Projekt der Anwendung) oder zu stark vereinfacht, bis sie nur in trivialen Situationen funktionieren.
Die kurze Antwort
Fügen Sie den folgenden Pfad zu Ihren Benutzerkopf-Suchpfaden hinzu
Warum funktioniert das?
Zuerst müssen wir das Problem verstehen. Unter normalen Umständen, dh beim Ausführen, Testen, Profilieren oder Analysieren, erstellt Xcode Ihr Projekt und legt die Ausgabe im Verzeichnis Build / Products / Configuration / Products ab, das über das Makro $ BUILT_PRODUCTS_DIR verfügbar ist .
In den meisten Handbüchern zu statischen Bibliotheken wird empfohlen, den Ordnerpfad für öffentliche Header auf $ TARGET_NAME festzulegen. Dies bedeutet, dass Ihre lib-Datei zu $ BUILT_PRODUCTS_DIR /libTargetName.a wird und Ihre Header in $ BUILT_PRODUCTS_DIR / TargetName abgelegt werden. Solange Ihre App $ BUILT_PRODUCTS_DIR in ihren Suchpfaden enthält, funktionieren Importe in den oben genannten 4 Situationen. Dies funktioniert jedoch nicht, wenn Sie versuchen, zu archivieren.
Die Archivierung funktioniert etwas anders
Wenn Sie ein Projekt archivieren, verwendet Xcode einen anderen Ordner namens ArchiveIntermediates. In diesem Ordner finden Sie / YourAppName / BuildProductsPath / Release-iphoneos /. Dies ist der Ordner, auf den $ BUILT_PRODUCTS_DIR verweist, wenn Sie ein Archiv erstellen . Wenn Sie dort nachsehen, werden Sie feststellen, dass ein Symlink zu Ihrer erstellten statischen Bibliotheksdatei vorhanden ist, der Ordner mit den Headern jedoch fehlt.
Um die Header (und die lib-Datei) zu finden, müssen Sie zu IntermediateBuildFilesPath / UninstalledProducts / gehen. Erinnern Sie sich, als Sie aufgefordert wurden, Skip Install für statische Bibliotheken auf YES zu setzen ? Nun, das ist der Effekt, den die Einstellung hat, wenn Sie ein Archiv erstellen.
Randnotiz: Wenn Sie die Installation nicht überspringen, werden Ihre Header an einem anderen Speicherort abgelegt und die lib-Datei in Ihr Archiv kopiert, sodass Sie keine IPA-Datei exportieren können, die Sie an den App Store senden können .
Nach langem Suchen konnte ich kein Makro finden, das genau dem Ordner "UninstalledProducts" entspricht. Daher muss der Pfad mit "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" erstellt werden.
Zusammenfassung
Stellen Sie für Ihre statische Bibliothek sicher, dass Sie die Installation überspringen und Ihre öffentlichen Header in $ TARGET_NAME abgelegt sind.
Setzen Sie für Ihre App die Suchpfade für Benutzerheader auf "$ (BUILT_PRODUCTS_DIR)", was für reguläre Builds gut funktioniert, und auf "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts", was für Archivbuilds funktioniert.
quelle
$(TARGET_BUILD_DIR)
. Auch während der Archivierung. ;)Ich bin auf dasselbe Problem gestoßen, als ich meine eigene statische Bibliothek entwickelt habe, und obwohl Colins Antwort sehr hilfreich war, musste ich sie ein wenig ändern, um konsistent und einfach zu funktionieren, wenn Projekte unter Xcode 4 unter Verwendung eines Arbeitsbereichs ausgeführt und archiviert wurden.
Das Besondere an meiner Methode ist, dass Sie für alle Build-Konfigurationen einen einzelnen Benutzer-Headerpfad verwenden können.
Meine Methode ist wie folgt:
Erstellen Sie einen Arbeitsbereich
Projekteinstellungen für statische Bibliotheken
Ich habe dies aus der Verwendung mit RestKit übernommen und festgestellt, dass es mit all meinen statischen Bibliotheken am besten funktioniert. Dadurch wird Xcode angewiesen, alle Header, die wir in Schritt 1 in den Abschnitt "Öffentliche" Header verschoben haben, in den hier angegebenen Ordner zu kopieren, der sich beim Erstellen im Ordner "Abgeleitete Daten" befindet. Wie bei RestKit verwende ich gerne einen einzelnen "Include" -Ordner, um jede statische Bibliothek zu enthalten, die ich in einem Projekt verwende.
Ich mag es auch nicht, hier Makros zu verwenden, da wir später einen einzelnen Benutzer-Header-Suchpfad verwenden können, wenn wir das Projekt mithilfe der statischen Bibliothek konfigurieren.
Einstellungen für das Projekt mithilfe der statischen Bibliothek
Suchen Sie im selben Bereich nach Suchpfaden für Benutzerkopfzeilen und fügen Sie Folgendes hinzu:
"$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include"
Dadurch wird Xcode angewiesen, im Zwischen-Build-Ordner, den Xcode während des Build-Prozesses erstellt, nach statischen Bibliotheken zu suchen. Hier haben wir den Ordner "include", den wir für unsere statischen Bibliotheksspeicherorte verwenden, die wir in Schritt 2 für die Projekteinstellungen der statischen Bibliothek eingerichtet haben. Dies ist der wichtigste Schritt, damit Xcode Ihre statischen Bibliotheken korrekt findet.
Konfigurieren Sie den Arbeitsbereich
Hier möchten wir den Arbeitsbereich so konfigurieren, dass er beim Erstellen unserer App die statische Bibliothek erstellt. Dies erfolgt durch Bearbeiten des für unsere App verwendeten Schemas.
Starten Sie die Verwendung der Bibliothek
Jetzt sollten Sie in der Lage sein, Ihre statische Bibliothek mit zu importieren
Diese Methode umgeht den Aufwand, unterschiedliche Benutzer-Header-Pfade für unterschiedliche Konfigurationen zu haben, sodass Sie keine Probleme beim Kompilieren für Archive haben sollten.
Warum funktioniert das?
Es hängt alles von diesem Weg ab:
Da wir unsere statische Bibliothek für die Verwendung von "Installation überspringen" konfigurieren, werden die kompilierten Dateien in den Ordner "UninstalledProjects" im temporären Erstellungsverzeichnis verschoben. Unser Pfad hier wird auch in den Ordner "include" aufgelöst, den wir für unsere statische Bibliothek eingerichtet und für unseren Suchpfad für Benutzer-Header verwendet haben. Die beiden, die zusammenarbeiten, lassen Xcode wissen, wo sich unsere Bibliothek während des Kompilierungsprozesses befindet. Da dieses temporäre Build-Verzeichnis sowohl für Debug- als auch für Release-Konfigurationen vorhanden ist, benötigen Sie nur einen einzigen Pfad für Xcode, um nach statischen Bibliotheken zu suchen.
quelle
Xcode 4-Projekt Kompiliert keine statische Bibliothek
Fehler können sein; fehlende Header-Dateien, "lexikalisches oder Präprozessor-Problem"
Lösungen:
quelle
Dies war ein sehr hilfreicher Thread. Bei der Untersuchung meiner eigenen Situation stellte ich fest, dass Apple ein 12-seitiges Dokument vom September 2012 mit dem Titel "Verwenden statischer Bibliotheken in iOS" hat. Hier ist der PDF-Link: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf
Es ist viel einfacher als die meisten Internetdiskussionen und mit einigen kleinen Mods, die berücksichtigen, wie die von mir verwendeten externen Bibliotheken konfiguriert sind, funktioniert es gut für mich. Der wichtigste Teil ist wahrscheinlich:
Ich bin mir sicher, dass der Ansatz von Apple in vielen bestehenden Situationen möglicherweise nicht ausreicht. Ich poste dies hier für alle, die gerade ihre Reise auf dem statischen Bibliotheksgartenweg beginnen - dies kann der beste Ausgangspunkt für einfache Fälle sein.
quelle
http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html
Per Apple-Dokumentation:
Ihre Bibliothek verfügt über eine oder mehrere Header-Dateien, die Clients dieser Bibliothek importieren müssen. Um zu konfigurieren, welche Header in Clients exportiert werden, wählen Sie Ihr Bibliotheksprojekt aus, um den Projekteditor zu öffnen, wählen Sie das Bibliotheksziel aus, um den Zieleditor zu öffnen, und wählen Sie die Registerkarte Erstellungsphasen. Wenn Ihr Bibliotheksziel eine Erstellungsphase "Header kopieren" hat, sollten Sie diese löschen. Die Erstellungsphasen für Kopierheader funktionieren mit statischen Bibliothekszielen nicht ordnungsgemäß, wenn die Aktion "Archivieren" in Xcode ausgeführt wird.
quelle
Werfen Sie einen Blick auf Jonah Wlliams Lösung (auf halbem Weg nach unten) und das GitHub-Modell (in Kommentaren), um einen Einblick zu erhalten. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/
quelle
Fügen Sie $ (OBJROOT) / UninstalledProducts / surePathToHeaders zu den Header- Suchpfaden hinzu .
Aus irgendeinem Grund funktionierte das Kontrollkästchen für rekursive Funktionen bei mir nicht und ich musste den Rest des Pfads an der Stelle hinzufügen, an der sich die Header befinden.
Unter dem Protokollnavigator in Xcode (der Registerkarte rechts neben dem Haltepunktnavigator) können Sie den Erstellungsverlauf anzeigen. Wenn Sie den tatsächlichen Build-Fehler auswählen, können Sie dessen Details erweitern, um den Setenv- Pfad anzuzeigen, und überprüfen, ob der Pfad zu Ihren Header-Dateien vorhanden ist.
quelle
In meinem Fall hatte mein Arbeitsbereich einige statische Bibliotheksprojekte, von denen eines abhängig ist, einschließlich Header-Dateien mit dem anderen. Das Problem war mit der Reihenfolge des Bauens. Auf der Seite Schema bearbeiten im Abschnitt Erstellen habe ich die Option Parallelisieren deaktiviert und die Reihenfolge der Ziele gemäß den Abhängigkeiten angeordnet und sie nach Problemen gelöst
quelle
Fügen Sie den folgenden Pfad zu Ihren Benutzerkopf-Suchpfaden hinzu:
Dies ist verifiziert!
quelle
Auf die Gefahr hin zu zeigen, was für ein Idiot ich bin ... Ich habe unter XCode gelitten und mich den ganzen Nachmittag geweigert, meine .h-Dateien zu finden.
Dann wurde mir klar.
Da ich "XCode 4" verwendete, hatte ich "intelligent" beschlossen, alle meine Projekte in einem Unterordner eines Ordners namens " XCode 4-Projekte " abzulegen .
Diese Leerzeichen im Ordnernamen haben XCode durcheinander gebracht!
Das Umbenennen dieses Ordners in " XCode_4_Projects " hat Freude (und weniger Fluchen) in mein Leben zurückgebracht.
Erinnern Sie mich noch einmal, welches Jahr ist das?
Vielleicht könnte jemand den Apple-Entwicklern sagen ...
quelle
Keine dieser Antworten hat bei mir funktioniert. Hier ist was getan hat. Fügen Sie Ihrer Build-Einstellung für Benutzerpfad-Suchpfade genau Folgendes hinzu (Kopieren und Einfügen einschließlich der doppelten Anführungszeichen) :
Beachten Sie das Hinzufügen des Unterverzeichnisses "/ include /" im Vergleich zu anderen Antworten. Wie andere Benutzer bereits betont haben, scheint die Option "rekursiv" nichts zu bewirken, sodass Sie sie ignorieren können.
Mein Projekt konnte jetzt erfolgreich archiviert werden, wenn statische Bibliotheksheaderdateien in der folgenden Form importiert wurden:
Sie müssen die Einstellung Immer Benutzerpfade suchen nicht aktivieren , es sei denn, Sie fügen Ihre statischen Bibliotheksheader mit spitzen Klammern ( ) ein, aber Sie sollten es sowieso nicht so machen, wenn es sich nicht um einen System- / Framework-Header handelt.
#import <LibraryName/HeaderFile.h>
quelle
Keine der obigen Antworten hat bei Xcode 7 für mich funktioniert, aber sie haben mir eine gute Idee gegeben. Für Leute, die mit Xcode 7 zu kämpfen haben, wurde dies behoben, indem Folgendes zu den Suchpfaden für Benutzer-Header hinzugefügt wurde (einschließlich Anführungszeichen).
Ändern Sie den relativen URL-Teil
usr/local/include
entsprechend den Angaben in der Einstellung "Öffentlicher Header-Ordnerpfad" der statischen Bibliothekquelle
Dies ist ein verwandtes Problem, das mich zu dieser Frage geführt hat, daher füge ich meine Lösung ausschließlich zur Dokumentation hinzu / es könnte weitere Seelenstunden des Schwitzens sparen
DropboxSDK.h-Datei nicht gefunden
Nachdem ich tagelang versucht hatte, VES zum Kompilieren für iOS zu bewegen, stieß ich schließlich auf dieses Problem. Das
DropboxSDK.h
war definitiv in Reichweite vonsearch headers
Ich fügte es sogar demframework headers
Suchpfad hinzu,include
d das.h
direkt und ging zu allen möglichen großen Längen, um zu versuchen,DropboxSDK.h
gefunden zu werden.Lösung
EXPLICITY Ziehen Sie die
DropboxSDK.framework
Datei in XcodesProject Navigation
und stellen Sie sicher, dass sie aktiviertCopy Files if needed
ist. Stellen Sie außerdem sicher, dass Ihr Ziel nach Bedarf überprüft wird.Warnung
Das Festlegen des expliziten Framework-Speicherorts in
build phases
hat bei mir nicht funktioniert. Ich musste ziehen die .framework in Xcode und stellen Sie sicher , die mein Projekt kopiert Dateien.# mbp2015 # xcode7 # ios9
quelle
Es gibt verschiedene komplexe Möglichkeiten, dies zu tun, und in diesem Thread werden einige sehr intelligente Lösungen vorgeschlagen.
Das Hauptproblem bei all diesen Lösungen besteht darin, dass die Portabilität Ihrer Bibliothek dadurch erheblich beeinträchtigt wird.
Meine Wahl war schließlich, einfach Frameworks zu verwenden - immer - wie von Apple empfohlen (WWDC-Videos).
Es ist so einfacher und macht am Ende den gleichen Job!
Eine andere ziemlich elegante Lösung, die zu funktionieren scheint, ist die Verwendung von privaten Cocoapods. Cocoapods erledigt die gesamte Konfigurationsarbeit, das Kopieren der Header und so weiter.
Frameworks rocken!
quelle
simply use frameworks - always -
Hier ist, was das gleiche Problem für mich gelöst hat.
Ich habe ein App-Ziel und ein iMessage-Erweiterungsziel. Dann hatte ich 2 SDKs (meine eigenen), mit denen das App-Ziel verknüpft ist.
Das Problem war: Mein iMessage-Ziel verwendete auch meine 2 SDKs (separate Projekte), aber es wurde in Build-Phasen -> Binär mit Bibliotheken verknüpfen nicht mit ihnen verknüpft. Ich musste dort meine 2 SDKs zum iMessage-Ziel hinzufügen, um meinem App-Ziel zu entsprechen, und jetzt wird es archiviert.
Die Moral der Geschichte lautet also: Wenn Sie mehrere Ziele haben, z. B. Erweiterungen, stellen Sie sicher, dass alle Ihre Ziele mit den benötigten Bibliotheken verknüpft sind. Es konnte auf Simulator und Gerät erstellt und bereitgestellt werden, nicht jedoch auf Archiv.
quelle
Update: Xcode 9
Die obigen Antworten haben bei mir mit Xcode 9 nicht funktioniert, aber diese Antwort hat bei mir perfekt funktioniert. Ich habe
$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include
meinen "Header-Suchpfaden" hinzugefügt und Xcode hat den Header meiner statischen Bibliothek ohne Probleme verknüpft.quelle
Sparen Sie sich die Mühe und tun Sie dies = Erstellen Sie ein neues Benutzerkonto auf Ihrem Mac - öffnen Sie das Projekt unter dem neuen Benutzerkonto - alle Probleme verschwinden. Sparen Sie Ihre Zeit und bewahren Sie Ihre geistige Gesundheit. all diese nerdigen Antworten helfen nicht !!
Viel Glück
quelle