2016-02-10 28 views
6

voglio includere libgpgerror e Libgcrypt nel mio swift-progetto e creato le seguenti: module.modulemapsXcode "ld: libreria non trovato [...] per l'architettura 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 * 
} 

ho anche aggiunto il "Swift Compiler - Percorso di ricerca/Importa Paths": /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/** sia di progetto e di destinazione. I moduli sono stati trovati, i percorsi sono corretti.

Tuttavia se voglio compilare il progetto ottengo il seguente errore:

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

Ma se faccio

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

ottengo l'uscita

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

così sembra la libreria è nella posizione corretta e ha anche l'architettura corretta.


Modifica

ho trovato una soluzione: ho rimosso il link-direttiva dalle modulemaps e collegato le librerie manualmente; questo sembra funzionare. Ma perché?

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

Stai utilizzando Swift Package Manager? Come sei riuscito a collegare le librerie manualmente? –

+1

Sono riuscito a farlo compilare specificando esplicitamente il percorso di dylib nel comando di costruzione rapida. 'swift build -Xlinker -L/usr/local/lib/-Xcc -I/usr/local/include /' –

+0

Se non si aggiunge la direttiva link, è possibile specificare il flag '-luv' e generare un xcodeproj che avrà i set di flag necessari: 'swift build -Xlinker -L/usr/local/lib/-Xcc -I/usr/local/include/-Xlinker -luv --generate-xcodeproj' –

risposta

5

La direttiva di collegamento specifica solo il nome della libreria collegata. Questo dovrebbe specificare il suffisso del flag del linker per la libreria. Sembra che la direttiva prenda "-l" e concateni il nome per produrre il flag del linker.

Ciò significa che il modo corretto di specificare la mappa del modulo è il seguente.

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

Questo genererà la bandiera linker -lgcrypt che è la bandiera del linker corretto.

Tuttavia, c'è un altro problema che è che il linker deve essere in grado di trovare il file dylib per gcrypt e, per impostazione predefinita, cerca solo determinati percorsi. Questi percorsi possono essere trovati eseguendo clang -Xlinker -v. L'uscita per me assomiglia a questo:

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

Ora io non sono sicuro, ma ho il sospetto che i normali percorsi di ricerca sono probabilmente

/usr/lib 
/usr/local/lib 

ma penso che Xcode ha alterato i miei percorsi di ricerca per puntare il MacOSX10.11.sdk/usr/lib, che, per inciso, ha praticamente lo stesso insieme di file come /usr/lib (non sono link simbolici). In El Capitan, infatti, grazie alla System Integrity Protection anche sudo non ti consente di modificare /usr/lib.

Quindi il problema che sto avendo è che anche se ho installato le mie librerie su /usr/local/lib, clang non è in grado di collegarle.Per risolvere il problema, posso specificare esplicitamente il percorso di ricerca.

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

E siamo fuori per le gare. Posso anche generare un xcodeproj che avrà il flag linker appropriato già impostato in Other Linker Flags.

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

Se si lascia fuori la direttiva collegamento nel file modulo di carta, è possibile specificare come una bandiera:

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

Come così

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

Come modificare la libreria di default percorsi di ricerca, non lo so. Ma sarebbe bello se qualcun altro potesse far luce su questo argomento!

+0

Almeno in Xcode, puoi semplicemente aggiungere un altro percorso di ricerca della libreria. Questa soluzione ha funzionato; ty –

Problemi correlati