2014-06-17 2 views
0

J'ai une application qui lie à ma bibliothèque statique. Je viens d'ajouter le code d'accessibilité d'Apple à la bibliothèque, mais cela a empêché l'application de se lier (même si l'application n'utilise pas le code d'accessibilité, ni ne l'inclut indirectement, en plus, Reachability.m est contenu dans la bibliothèque. la section Compiler Sources de la bibliothèque).Comment lier avec une bibliothèque statique qui elle-même lie avec une bibliothèque dynamique?

J'ai donc ajouté -ObjC à d'autres indicateurs de liens dans l'application et cela a résolu les erreurs de liaison pour l'accessibilité. Toutefois, la bibliothèque utilise également ZipArchive et l'ajout de l'indicateur de lien -ObjC a provoqué des erreurs de liaison liées à cela.

Alors, que puis-je faire? Laisser -ObjC désactivé et Reachability ne lient pas, l'incluent et ZipArchive ne lient pas. Y a-t-il une solution?

Exemple erreur de liens ZipArchiev:

Undefined symbols for architecture arm64: 
    "_deflate", referenced from: 
     _zipWriteInFileInZip in libMyLibrary.a(zip.o) 
     _zipCloseFileInZipRaw in libMyLibrary.a(zip.o) 

Exemple erreur de liens joignabilité:

Undefined symbols for architecture arm64: 
    "_SCNetworkReachabilityGetFlags", referenced from: 
     -[Reachability connectionRequired] in libMyLibrary.a(Reachability.o) 
     -[Reachability currentReachabilityStatus] in libMyLibrary.a(Reachability.o) 

La bibliothèque statique est en cours de construction avec le drapeau -ObjC et les liens avec libz.1.2.5.dylib

J'ai effectivement une solution que j'ai trouvée après avoir publié ceci - je peux ajouter l'indicateur -ObjC à l'application et lier l'application avec libz.1.2.5.dylib. Mais l'OMI n'est pas un bon découplage - ma bibliothèque statique va être distribuée et utilisée par les autres applications et le fait qu'elle utilise libz devrait être transparent pour eux et ils ne devraient pas avoir à se lier s'ils se lient déjà à ma bibliothèque . Y a-t-il un moyen de résoudre le problème de liaison sans que les applications aient à lier à la fois ma bibliothèque statique et la bibliothèque dynamique libz?

+0

Avez-vous joignabilité lié à votre binaire dans Xcode? –

+0

L'accessibilité n'est pas une bibliothèque, son code source (fourni par Apple) – Gruntcakes

+0

Oui mais vous devez toujours vous assurer que le fichier d'implémentation est lié à la source de l'application –

Répondre

0

Je ne sais pas pourquoi vous avez besoin de -ObjC pour l'accessibilité. Cela est généralement nécessaire lorsque vous utilisez des catégories d'une bibliothèque statique. Mais je ne vois aucune catégorie dans Reachability.

De toute façon, voici une solution que j'ai trouvée pour pouvoir faire fonctionner les catégories sans -ObjC. J'espère que cela pourrait marcher pour vous aussi.

Supprimez l'indicateur de liaison -ObjC. Comme cela peut causer des problèmes avec beaucoup de choses, il vaut mieux commencer par là. Maintenant, à partir de votre code de bibliothèque statique, vous voulez forcer la classe Reachability à être compilée dans le binaire et chargée à l'exécution (c'est la description de mon profane, probablement pas la vraie technique). Pour ce faire, il suffit d'ajouter cette fonction au sommet de la classe joignabilité:

void loadReachability() 
{ 
    // This is a trick to force the compiler to include this code. 
} 

ajouter cette extérieur du @implementation. Je dois le mettre dans le .h pour le rendre public. En fait, je ne l'appelle jamais depuis ma bibliothèque statique. Le compilateur a juste besoin de penser que je vais l'appeler. Je l'appelle après une déclaration de retour, donc cela n'arrive pas à l'exécution. Juste feinte le compilateur. Je n'utilise pas réellement Reachability dans mon code, mais j'ai changé le code ci-dessous pour utiliser "Reachability" plutôt que les 10 catégories ou que j'ai besoin de charger.

+ (LPFSessionManager *)sharedManager 
{ 
    static LPFSessionManager *sharedManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedManager = [[LPFSessionManager alloc] init]; 
    }); 
    return sharedManager; 

    // Notice we don't really need to call this. We're faking out the compiler to include some code. 
    loadReachability(); 
} 

Cela pourrait aller dans une méthode -init à la place.

J'ai trouvé cette solution ici, et il travaille très bien pour moi: Objective-C categories in static library

Questions connexes