2017-03-02 1 views
1

Ich habe ein statisches Framework B, das ich in einem Framework A verwenden. B hat eine Klasse CI wollen auch in A aussetzen, dh in der Abbildung unten möchte ich die App nutzen können Klasse.Expose-Header im statischen Framework verwendet

App> Rahmen A> statische Rahmen B> Klasse C

Wenn ich versuche, den Header für C in den öffentlichen Header von A enthalten, erhalte ich 'doppelte Schnittstellendefinition'. Aber da der Code in A von B kompiliert wird, muss ich nur die Klassenschnittstelle offen legen - vermutlich ermöglicht das der App, die Verknüpfung korrekt herzustellen ...?

+0

Erstellen Sie eine Kopfzeile für den Import von B und C, dann importieren Sie es in A? – antonio081014

+0

Ich kann die Kopfzeile Geldstrafe importieren, es macht es öffentlich in A, das mich Probleme verursacht. – Nick

Antwort

0

Ich erreichte dies durch ein bisschen wie ein Workaround.

Wenn eine statische Bibliothek/ein Framework in ein anderes Framework/eine statische Bibliothek kompiliert wird, sind ihre Symbole immer noch verfügbar (überprüfen Sie durch nm <binary> | grep <symbol>). Das bedeutet, dass Sie nur Ihren App-Code benötigen, um über diese Symbole Bescheid zu wissen - d. H. Einschließlich des Headers für Klasse C in Framework A.

In Ihren Headern in Framework A müssen Sie den Header der Klasse C einfügen. Wenn Sie das Framework kompilieren, müssen Sie "ClassC.h" verwenden, aber wenn das Framework verwendet wird, benötigen Sie <FrameworkName/ClassC.h>, da dies der Speicherort in dem Framework ist, das in der App enthalten ist. Verwenden Sie dazu ein Makro, das in einer Run-Script-Phase entfernt wird.

im Rahmen So wird ein Soll-Build-Phasen, stellen Sie sicher, dass Ihre Header für die Klasse C ist in der ‚Öffentlichkeit‘ Abschnitt Ihrer Kopie Header Phase, dann eine ‚Run Script‘ Phase hinzufügen und fügen Sie den folgenden:

TARGET_MACRO="TARGET_FRAMEWORK" 
cd -P "$BUILT_PRODUCTS_DIR/$WRAPPER_NAME/Headers/" 
perl -0pi -e "s/\#if ${TARGET_MACRO}.*?\#else\r?\n?(.*?)\r?\n?\#endif/\1/sg" *.h 

ändern `TARGET_FRAMEWORK“ zu sein, was auch immer, oder es verlassen.

in Framework Ein Einstellungen bauen, unter Präprozessormakros, fügen TARGET_FRAMEWORK=1 für alle Konfigurationen bauen.

Dann in Ihrem Framework Ein Header, die enthalten Klasse C, verwenden:

#if TARGET_FRAMEWORK 
#import "ClassC.h" 
#else 
#import <FrameworkA/ClassC.h> 
#endif 
Verwandte Themen