Xcode 4 kann keine öffentlichen Header-Dateien aus der Abhängigkeit von statischen Bibliotheken finden


91

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 directoryin 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 directoryist relativ zum DerivedDataVerzeichnis, aber
  • headers 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?


Könnte mit Pfadnamen zusammenhängen. Bitte überprüfen Sie diesen Beitrag. [Statische Bibliotheken in Xcode 4] [1] [1]: stackoverflow.com/questions/6074576/static-libraries-in-xcode-4/…
Diego Marafetti

Antworten:


124

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

"$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"

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.


In welcher Beziehung steht dies zum Ordner DerivedData?
Richard Stelling

Regelmäßige Builds gehen zu: DerivedData / WorkspaceName-Hash / Build / Products / Debug-iphoneos / TargetName.app --- Archiv-Builds gehen zu: DerivedData / WorkspaceName-Hash / Build / Intermediates / ArchiveIntermediates / TargetName / BuildProductsPath / Release-iphoneos / TargetName.app
Colin

3
Bei mir funktionierte die Verwendung von "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" mit dem rekursiven Kontrollkästchen nicht. Sobald ich "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / <nameOfStaticLibrary>" ohne das rekursive Flag verwendet habe, hat es bei mir funktioniert.
TPoschel

7
Beachten Sie, dass Ihr $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts tatsächlich ist $(TARGET_BUILD_DIR). Auch während der Archivierung. ;)
Pascal

1
Für mich in Xcode 5: $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / include / NAME DER BIBLIOTHEK Ich habe nicht auf JA gesetzt: Immer nach Benutzerpfaden suchen.
xarly

84

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

  1. Gehen Sie unter Xcode 4 zu Datei, Neu, Arbeitsbereich.
  2. Aus dem Finder können Sie dann die .xcodeproj-Projekte sowohl für die statische Bibliothek, die Sie verwenden möchten, als auch für die neue App, die Sie erstellen und die die Bibliothek verwendet, ziehen. Weitere Informationen zum Einrichten von Arbeitsbereichen finden Sie in den Apple-Dokumenten: https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

Projekteinstellungen für statische Bibliotheken

  1. Stellen Sie sicher, dass alle Header der statischen Bibliothek so eingestellt sind, dass sie nach "Öffentlich" kopiert werden. Dies erfolgt unter den Einstellungen für das statische Bibliotheksziel> Build-Phasen. Stellen Sie in der Phase "Header kopieren" sicher, dass sich alle Ihre Header im Abschnitt "Öffentlich" befinden.
  2. Gehen Sie als Nächstes zu Build Settings, suchen Sie nach "Public Headers Folder Path" und geben Sie einen Pfad für Ihre Bibliothek ein. Ich wähle dies:

include / LibraryName

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.

  1. Suchen Sie nach "Installation überspringen" und stellen Sie sicher, dass dies auf JA gesetzt ist.

Einstellungen für das Projekt mithilfe der statischen Bibliothek

  1. Fügen Sie die statische Bibliothek als Framework unter Build Phases> Link Binary With Libraries hinzu und fügen Sie die Datei libLibraryName.a für die gewünschte statische Bibliothek hinzu.
  2. Stellen Sie als Nächstes sicher, dass das Projekt so eingestellt ist, dass es nach Benutzersuchpfaden sucht. Dies erfolgt unter Build-Einstellungen> Immer nach Benutzerpfaden suchen und stellen Sie sicher, dass YES festgelegt ist.
  3. 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.

  1. Stellen Sie sicher, dass Sie das Schema ausgewählt haben, mit dem Ihre Anwendung erstellt wird.
  2. Wählen Sie in der Dropdown-Liste Schema die Option Schema bearbeiten.
  3. Wählen Sie links oben in der Liste die Option Erstellen. Fügen Sie ein neues Ziel hinzu, indem Sie das + im mittleren Bereich drücken.
  4. Die statische Bibliothek sollte für die Bibliothek angezeigt werden, die Sie verknüpfen möchten. Wählen Sie die statische iOS-Bibliothek.
  5. Klicken Sie auf Ausführen und Archivieren. Dadurch wird das Schema angewiesen, die Bibliotheken für die statische Bibliothek zu kompilieren, wenn Sie Ihre App erstellen.
  6. Ziehen Sie die statische Bibliothek über Ihr Anwendungsziel. Dadurch werden die statischen Bibliotheken vor Ihrem Anwendungsziel kompiliert.

Starten Sie die Verwendung der Bibliothek

Jetzt sollten Sie in der Lage sein, Ihre statische Bibliothek mit zu importieren

import <LibraryName/LibraryName.h>

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:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

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.


3
Du bist großartig, Mann! Dies ist sehr hilfreich und funktioniert wie beschrieben.
Neevek

1
genial. Wohin soll ich Blumen schicken :)
Ramesh

1
Nach dem Einrichten können einige von Ihnen auf " ...] nicht erkannten Selektor stoßen , der an Klasse 0x ... gesendet wurde . Versuchen Sie in diesem Fall, dies in den Zielen Ihres Projekts- > Projekt-> Build-Einstellungen-> Verknüpfen-> Andere Linker-Flags zu addieren
MkVal

Stellen Sie sicher, dass die Benutzerpfad-Suchpfade in Anführungszeichen stehen, wenn sie Leerzeichen enthalten.
Respektieren Sie den Code

Xcode 4.6.2 schreibt für mich nichts in "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include". Irgendeine Idee, was mir fehlt? Oder hat sich das Xcode-Verhalten erneut geändert?
C Roald

16

Xcode 4-Projekt Kompiliert keine statische Bibliothek

Verwandte Frage: "Lexikon- oder Präprozessor-Problemdatei nicht gefunden" in Xcode 4

Fehler können sein; fehlende Header-Dateien, "lexikalisches oder Präprozessor-Problem"

Lösungen:

  1. Überprüfen Sie, ob die "Benutzer-Header-Pfade" korrekt sind
  2. Setzen Sie "Immer nach Benutzerpfaden suchen" auf JA
  3. Erstellen Sie einen Gruppenaufruf "Indizieren von Headern" in Ihrem Projekt und ziehen Sie die Header in diese Gruppe. Fügen Sie KEINE Ziele hinzu, wenn Sie dazu aufgefordert werden.

11
Ein weiterer leicht zu übersehender, aber äußerst wichtiger Schritt: Stellen Sie sicher, dass Ihre Suchpfade in doppelte Anführungszeichen gesetzt sind, um Leerzeichen zu vermeiden. Das vergesse ich immer.
Brad

Danke @Brad, dies ist in der Tat eine sehr wichtige und hilfreiche Bemerkung.
Julian D.

15

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:

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.

Neue statische Bibliotheksziele, die mit Xcode 4.4 oder höher erstellt wurden, verfügen über eine entsprechend konfigurierte Phase zum Kopieren von Dateien für Header. Überprüfen Sie daher vor dem Erstellen, ob bereits eine vorhanden ist. Wenn Sie dies nicht tun, klicken Sie unten im Zieleditor auf "Build-Phase hinzufügen" und wählen Sie "Kopierdateien hinzufügen". Schließen Sie die neue Erstellungsphase zum Kopieren von Dateien ab und setzen Sie das Ziel auf "Produktverzeichnis". Setzen Sie den Unterpfad auf / $ {PRODUCT_NAME}. Dadurch werden Dateien in einen Ordner kopiert, der nach Ihrer Bibliothek benannt ist (aus der Build-Einstellung PRODUCT_NAME entnommen), und zwar in einen Ordner mit dem Namen include in Ihrem Verzeichnis für erstellte Produkte. Der Include-Ordner in einem Build-Produktverzeichnis befindet sich im Standard-Header-Suchpfad für Anwendungen. Dies ist also ein geeigneter Ort, um Header-Dateien abzulegen.

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.


Für diejenigen, die dem obigen Link folgen. Vorsicht: Der Schritt, in dem Sie aufgefordert werden, die Dummy-Vorlagendateien zu löschen, wenn Sie das Bibliotheksprojekt erstellen. LÖSCHEN SIE DIE * .pch-Datei NICHT. Sie wird Sie schließlich verfolgen Ratschläge funktionieren nicht mit Kategorien. Es gibt jedoch eine Lösung dafür (habe sie irgendwo gesehen)
Abbood

Vielen Dank, dass Sie einen Link zu einem offiziellen Apple-Ansatz zum Erstellen statischer Bibliotheken bereitgestellt haben. Ich habe zunächst meine statische Bibliothek mit diesem Ansatz erstellt , konnte sie jedoch nicht archivieren. @abbood - Was ist das Problem beim Löschen der generierten pch-Datei?
August Callejas

Wenn Sie die .pch-Datei löschen, wird das Projekt einfach nicht kompiliert. (zum Zwecke der Archivierung oder auf andere Weise).
Abbood

Es funktioniert nicht für mich. Wenn ich versuche, Anweisung mit "" zu importieren, funktioniert es nicht, ich brauche <>. Auch während der Archivierung kann es keine Header finden. Irgendwelche Ideen?
user1010819

4

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.


3

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/


4
Während dies die Frage technisch beantworten kann, ist es für Sie vorzuziehen , die wesentlichen Teile des verlinkten Artikels in Ihre Antwort aufzunehmen und den Link als Referenz bereitzustellen. Andernfalls ist die Antwort durch Link Rot gefährdet.
Jscs

2

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.


Guter Hinweis zum rekursiven Kontrollkästchen, gleiches Problem hier.
Codezy

Ja, ich musste auch einen bestimmten Unterordner angeben, die Überprüfung der rekursiven Funktion funktionierte nicht.
Oliver Pearmain

Am Ende habe ich diesen Pfad jedoch verwendet (einfach weil er kürzer ist) "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / SubProjectHeaders"
Oliver Pearmain

2

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


1

Fügen Sie den folgenden Pfad zu Ihren Benutzerkopf-Suchpfaden hinzu:

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

Dies ist verifiziert!


1

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 ...


1

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) :

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

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:

#import "LibraryName/HeaderFile.h"

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>


1

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).

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

Ändern Sie den relativen URL-Teil usr/local/includeentsprechend den Angaben in der Einstellung "Öffentlicher Header-Ordnerpfad" der statischen Bibliothek


0

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.hwar definitiv in Reichweite von search headersIch fügte es sogar dem framework headersSuchpfad hinzu, included das .hdirekt und ging zu allen möglichen großen Längen, um zu versuchen, DropboxSDK.hgefunden zu werden.

Lösung

EXPLICITY Ziehen Sie die DropboxSDK.frameworkDatei 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 phaseshat bei mir nicht funktioniert. Ich musste ziehen die .framework in Xcode und stellen Sie sicher , die mein Projekt kopiert Dateien.

# mbp2015 # xcode7 # ios9


0

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.

  • Jedes Mal, wenn Sie ein neues Projekt mit Ihrer Bibliothek starten und für iTunes archivieren müssen, ist dies eine Hölle der Konfiguration.
  • Jedes Mal, wenn Sie Ihr Projekt mit Ihrem Team oder Ihren Kunden teilen müssen, kann es aus irgendeinem Grund (Kontext, Xcode-Version, was auch immer, ..) unterbrochen werden.

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!


1
Wo stellst du das ein? simply use frameworks - always -
Neil Faulkner

Es ist nirgendwo eingestellt. Es ist einfach eine architektonische Wahl. Frameworks sind "moderne Bibliotheken", die viel einfacher zu verknüpfen und zu verwalten sind. Zum Zeitpunkt dieser Nachricht erlaubt swift immer noch nicht, Binärbibliotheken zu erstellen.
Elch

0

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.


0

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)/includemeinen "Header-Suchpfaden" hinzugefügt und Xcode hat den Header meiner statischen Bibliothek ohne Probleme verknüpft.


-18

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.