2016-02-10 5 views
6

I libgpgerror und libgcrypt in meinem swift-Projekt aufnehmen möchten, und erstellt die folgenden module.modulemaps:Xcode "ld: Bibliothek nicht gefunden [...] für Architektur x86_64"

libgpgerror:

libgcrypt:

module libgcrypt { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" 
    link "'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/libgcrypt-1.6.5.dylib'" 
    export * 
} 

ich habe auch den "Swift Compiler - Suchpfad/Import Pfade": /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/** sowohl Projekt und Ziel. Die Module sind gefunden, die Pfade sind korrekt.

Allerdings, wenn ich das Projekt, das ich die folgenden Fehler kompilieren will erhalten:

ld: library not found for -l'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib' for architecture x86_64 

Aber wenn ich

file /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib 

bekomme ich die Ausgabe

/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib: Mach-O 64-bit dynamically linked shared library x86_64 

es scheint so Die Bibliothek ist am richtigen Ort und hat auch die richtige Architektur.


bearbeiten

fand ich eine Abhilfe: Ich habe den Link-Richtlinie von den modulemaps entfernt und die Bibliotheken manuell verbunden sind; das scheint zu funktionieren. Aber warum?

module libgpgerror { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h" 
    export * 
} 
+0

Verwenden Sie den Swift Package Manager? Wie konnten Sie die Bibliotheken manuell verknüpfen? –

+1

Ich konnte es erstellen, indem ich explizit den Dylib-Pfad im Befehl swift Build eingab. 'swift build -Xlinker -L/usr/local/lib/-Xcc -I/usr/local/include /' –

+0

Wenn Sie die Link-Anweisung nicht hinzufügen, können Sie das '-luv'-Flag angeben und ein xcodeproj generieren Die folgenden Flags müssen gesetzt sein: 'swift build -Xlinker -L/usr/local/lib/-Xcc -I/usr/local/include/-Xlinker -luv --generate-xcodeproj ' –

Antwort

5

Die Link-Direktive gibt nur den Namen der verknüpften Bibliothek an. Das heißt, es sollte das Suffix des Linker-Flags für die Bibliothek angeben. Es scheint, dass die Direktive "-l" annimmt und den Namen verkettet, um das Linker-Flag zu erzeugen.

Dies bedeutet, dass die korrekte Methode zum Angeben der Modulzuordnung wie folgt lautet.

module CGcrypt { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" 
    link "gcrypt" 
    export * 
} 

Dies wird den Linker-Flag -lgcrypt erzeugen, die der richtige Linker-Flag.

Es gibt jedoch ein anderes Problem, dass der Linker in der Lage sein muss, die dylib-Datei für gcrypt zu finden, und standardmäßig nur nach bestimmten Pfaden sucht. Diese Pfade können durch Ausführen von clang -Xlinker -v gefunden werden. Die Ausgabe für mich sieht wie folgt aus:

tylercloutier$ clang -Xlinker -v 
@(#)PROGRAM:ld PROJECT:ld64-264.3.101 
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) 
Library search paths: 
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib 
... more stuff ... 

Jetzt bin ich mir nicht sicher, aber ich vermute, dass die normalen Suchpfade wahrscheinlich sind

/usr/lib 
/usr/local/lib 

aber ich denke, dass Xcode meine Suchpfade geändert hat zeigen Sie die MacOSX10.11.sdk/usr/lib, die übrigens im Grunde die gleiche Reihe von Dateien wie /usr/lib (sie sind nicht symlinked). In der Tat, in El Capitan, auch aufgrund von Systemintegritätsschutz, erlaubt es Ihnen sudo nicht, /usr/lib zu bearbeiten.

Also das Problem, das ich habe, ist, dass, obwohl ich meine Bibliotheken auf /usr/local/lib installiert habe, Clang ist nicht in der Lage, sie zu verknüpfen.Um das zu beheben, kann ich den Suchpfad explizit angeben.

swift build -Xlinker -L/usr/local/lib/ 

Und wir sind zu den Rennen. Ich kann sogar ein xcodeproj erzeugen, das das passende Linker-Flag bereits in Other Linker Flags gesetzt hat.

swift build -Xlinker -L/usr/local/lib/ --generate-xcodeproj 

Wenn Sie den Link-Direktive in der Modul-Map-Datei auslassen, können Sie es als Flag angeben:

module CGcrypt { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" 
    export * 
} 

Wie so

swift build -Xlinker -L/usr/local/lib/ -lgcrypt 

Wie wird die Standardbibliothek ändern Suchpfade, ich weiß es nicht. Aber es wäre großartig, wenn jemand anderes diese Angelegenheit beleuchten könnte!

+0

Zumindest in Xcode können Sie einfach einen weiteren Bibliothekssuchpfad hinzufügen. Diese Lösung funktionierte; ty –