2015-12-14 9 views
10

Ich verwende this answer, um eine Modulzuordnung zu erstellen, um ein Modul für CommonCrypto zu erstellen, damit ich es in einem Framework verwenden kann.Private Modulzuordnung für ein Framework

dies jedoch tun bedeutet, dass alle Projekte, die ich diesen Rahmen nutzen den Zugang zu CommonCrypto haben mit import CommonCrypto - und noch schlimmer, erklärt CommonCrypto in einem anderen Rahmen und importieren diese in die Projektergebnisse in Redefinition of module 'CommonCrypto' Fehler.

I.e. die folgende Konfiguration:

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

Gibt es eine Möglichkeit, ein Modul Karte zu schaffen, sondern hat es privat zu diesem Rahmen seines erstellt/verwendet in? (Ähnlich wie das Zugriffsattribut internal in Swift für ein Framework). Die llvm Clang docs zeigen eine private attribute aber ich kann nicht herausfinden, wo dies in meine Modulkarte eingefügt werden, und es könnte nicht einmal für diesen Zweck sein! Es gibt auch eine export attribute aber ich bin mir nicht ganz sicher, wie man das benutzt ...!

Das ist mein Modul Karte I für CommonCrypto bin mit - das $(SDKROOT) wird in einer Aufbauphase an die richtige Stelle ausgelagert (für iphoneos oder iphonesimulator SDKs):

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

Dies funktioniert gut (außer Sie kann nicht zur Definition gehen, aber das stört mich nicht) zur Verwendung in FrameworkA/FrameworkB.

+0

Hallo, sind irgendwelche Updates auf diesem? Ich habe das gleiche genaue Setup für libz :( – tmpz

+1

Rich, könnten Sie bitte Ihre Build-Phase Skript, das $ (SKROOT) ersetzt? Danke! – appleitung

+1

@appleitung: Skript ist hier: gist.github.com/rhodgkins/5eecee8bcbdb6021fc798247132e9fa7 und dann einstellen Es ist wie folgt: postimg.org/image/fj7j9nsqp in einem Projekt Vergessen Sie nicht, das Verzeichnis $ (PROJECT_DIR)/$ (TARGET_NAME)/ExternalFrameworks/zur Build-Einstellung * Framework Search Paths hinzuzufügen, dann alle Module Karten sollten im Eingangsverzeichnisordner sitzen - mit dem Ordnernamen, der die Modulkarte enthält, ist der Name. – Rich

Antwort

4

Haftungsausschluss: Ich habe dies für CommonCrypto nicht versucht, aber es funktioniert für meinen Fall mit libz

Eine mögliche Lösung dieses Problems ist eine module.private.modulemap zu schaffen, wie in der

So zum Beispiel

Clang documentation beschrieben in FrameworkA können Sie eine module.modulemap Datei für FrameworkA wie so schreiben:

module FrameworkACommon { 
} 

Die n Sie würden eine module.private.modulemap Datei wie schaffen so

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 * 
} 

Dann für FrameworkB wiederholen.

Jetzt CommonCrypto ist ein privates Modul in FrameworkA und FrameworkB und die Namen werden nicht kollidieren.

+0

Nice! Thanks for sharing - Ich werde es versuchen! – Rich

+0

@ tmpz Ich bekomme viel von 'Verwendung von nicht angemeldeten Typ ...' Sie haben dies gesehen? – azimov

+0

Sie erhalten wahrscheinlich nicht deklarierten Typ, weil Ihr Modul keine Header exportiert. Die 'export *' exportiert Header in 'FrameworkACommon' und um es zu importieren, müssen Sie' FrameworkA schreiben Common.Crypto' aber es wird dort aufhören.Exportierte Header sind nach FrameworkACommon nicht sichtbar, sie sind jetzt intern. – tmpz

Verwandte Themen