我正在使用这个答案创建一个模块映射来为CommonCrypto创建一个模块,这样我就可以在框架中使用它.
但是,这样做意味着我使用此框架的任何项目都可以访问CommonCrypto import CommonCrypto
- 更糟糕的是,在另一个框架中声明CommonCrypto并将其导入项目会导致Redefinition of module 'CommonCrypto'
错误.
即以下设置:
MainProject |--> import FrameworkA - module map for CommonCrypto |--> import FrameworkB - module map for CommonCrypto
有没有办法创建模块映射,但是它创建/使用的是哪个框架是私有的?(很像internal
Swift for Framework中的access属性).该LLVM锵文档显示private
属性,但我不能工作在什么地方把这个在我的模块图,它甚至可能不是为了这个目的!还有一个export
属性,但我再也不确定如何使用它......!
这是我用于CommonCrypto的模块映射 - $(SDKROOT)
在构建阶段将其换出到正确的位置(对于iphoneos
或iphonesimulator
SDK):
module CommonCrypto [system] [extern_c] { umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h" export * }
这工作正常(除了你不能"去定义"但我不介意)用于FrameworkA
/ FrameworkB
.
免责声明:我没有试过这个,CommonCrypto
但它适用于我的情况libz
可能的解决方案是创建Clang文档中module.private.modulemap
描述的内容
因此,例如在FrameworkA中,您可以module.modulemap
为FrameworkA 编写一个文件,如下所示:
module FrameworkACommon { }
然后你会创建一个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 * }
然后重复FrameworkB.
现在,CommonCrypto是FrameworkA和FrameworkB中的私有模块,名称不会冲突.