2015-12-14 10 views
10

Sto utilizzando this answer per creare una mappa modulo per creare un modulo per CommonCrypto in modo da poterlo utilizzare in un framework.Mappa modulo privata per un framework

Facendo questo però significa che i progetti che uso questo quadro hanno accesso a CommonCrypto con import CommonCrypto - e, peggio ancora, dichiarando CommonCrypto in un altro quadro e l'importazione in questo i risultati del progetto in Redefinition of module 'CommonCrypto' errori.

I.e. la seguente configurazione:

MainProject 
    |--> import FrameworkA - module map for CommonCrypto 
    |--> import FrameworkB - module map for CommonCrypto 

C'è un modo per creare una mappa modulo, ma lo hanno privato di tale ambito il suo creato/usato in? (Molto simile all'attributo di accesso internal in Swift for a Framework). Il llvm Clang docs mostra un private attribute ma non riesco a capire dove metterlo nella mia mappa del modulo, e potrebbe non essere nemmeno per questo scopo! C'è anche un export attribute ma di nuovo non sono del tutto sicuro di come usare questo ...!

Questa è la mia mappa modulo che sto utilizzando per CommonCrypto - la $(SDKROOT) ottiene scambiati in una fase di costruzione nella posizione corretta (per iphoneos o iphonesimulator SDK):

module CommonCrypto [system] [extern_c] { 
    umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h" 
    export * 
} 

Questo funziona bene (tranne te non posso "andare alla definizione" ma non mi dispiace) per l'uso in FrameworkA/FrameworkB.

+0

Ciao, aggiornato su questo? Ho lo stesso setup esatto per libz :( – tmpz

+1

Rich, potresti fornire lo script di fase build che sostituisce $ (SKROOT)? Grazie! – appleitung

+1

@appleitung: Script è qui: gist.github.com/rhodgkins/5eecee8bcbdb6021fc798247132e9fa7 e quindi impostare in questo modo: postimg.org/image/fj7j9nsqp in un progetto Non dimenticare di aggiungere la directory $ (PROJECT_DIR)/$ (TARGET_NAME)/ExternalFrameworks/all'impostazione di build * Percorsi di ricerca del framework, quindi tutto il modulo le mappe dovrebbero trovarsi nella cartella della directory di input - con il nome della cartella contenente il nome del modulo. – Rich

risposta

4

Diniego: non ho provato questo per CommonCrypto ma funziona per il mio caso con libz

Una possibile soluzione a questo è quella di creare un module.private.modulemap come descritto nel Clang documentation

Così, per esempio in FrameworkA è possibile scrivere un file module.modulemap per FrameworkA in questo modo:

module FrameworkACommon { 
} 

Il n si potrebbe creare un file in questo modo module.private.modulemap

explicit FrameworkACommon.Crypto [system] [extern_c] { 
    header "/Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h" 
    link "CommonCrypto" 
    export * 
} 

Poi ripetere per FrameworkB.

Ora CommonCrypto è un modulo privato in FrameworkA e FrameworkB ei nomi non si scontreranno.

+0

Nice! Grazie per la condivisione - lo proverò! – Rich

+0

@ tmpz Ricevo molta 'uso del tipo non dichiarato ...'. hai affrontato questo? – azimov

+0

Probabilmente stai ricevendo il tipo non dichiarato perché il tuo modulo non sta esportando alcuna intestazione. "export *" esporterà le intestazioni a 'FrameworkACommon' e per importarlo devi scrivere' FrameworkA Common.Crypto' ma si fermerà qui.Le intestazioni esportate non saranno visibili dopo FrameworkACommon, ora sono interne. – tmpz

Problemi correlati