web-dev-qa-db-fra.com

Carte de module privé pour un framework

J'utilise cette réponse pour créer une carte de module pour créer un module pour CommonCrypto afin que je puisse l'utiliser dans un cadre.

Cependant, cela signifie que tous les projets dans lesquels j'utilise ce cadre ont accès à CommonCrypto avec import CommonCrypto - et pire encore, déclarer CommonCrypto dans un autre cadre et l'importer dans le projet entraîne des erreurs Redefinition of module 'CommonCrypto'.

C'est à dire. la configuration suivante:

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

Existe-t-il un moyen de créer une mappe de module mais de la rendre privée à ce Framework créé/utilisé? (Tout comme l'attribut d'accès internal dans Swift pour un Framework). Les documents llvm Clang affichent un private attribute mais je ne peux pas trouver où le mettre dans la mappe de mon module, et ce n'est peut-être même pas pour cela! Il y a aussi un export attribute mais encore une fois Je ne sais pas trop comment utiliser ça ...!

Ceci est ma carte de module que j'utilise pour CommonCrypto - la $(SDKROOT) est échangée dans une phase de construction à l'emplacement correct (pour iphoneos ou iphonesimulator SDK):

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

Cela fonctionne très bien (sauf que vous ne pouvez pas "aller à la définition" mais cela ne me dérange pas) pour une utilisation dans FrameworkA/FrameworkB.

16
Rich

Clause de non-responsabilité : Je n'ai pas essayé cela pour CommonCrypto mais cela fonctionne pour mon cas avec libz

Une solution possible à cela consiste à créer un module.private.modulemap comme décrit dans la documentation Clang

Ainsi, par exemple, dans FrameworkA, vous pouvez écrire un module.modulemap fichier pour FrameworkA comme ceci:

module FrameworkACommon {
}

Ensuite, vous créez un module.private.modulemap fichier comme ça

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

Répétez ensuite pour FrameworkB.

Maintenant CommonCrypto est un module privé dans FrameworkA et FrameworkB et les noms ne s'affronteront pas.

6
tmpz