我使用this answer创建模块映射来为CommonCrypto创建模块,以便我可以在框架中使用它。
这样做意味着我使用此框架的任何项目都可以使用import CommonCrypto
访问CommonCrypto - 更糟糕的是,在另一个框架中声明CommonCrypto并将其导入项目会导致Redefinition of module 'CommonCrypto'
错误
即。以下设置:
MainProject
|--> import FrameworkA - module map for CommonCrypto
|--> import FrameworkB - module map for CommonCrypto
有没有办法创建模块映射,但是将其创建/使用的框架私有? (与Swift for a Framework中的internal
访问属性非常相似)。
llvm Clang docs显示private
attribute,但我无法确定将其放在我的模块地图中的位置,甚至可能不是出于此目的!
还有一个export
attribute但我又不能完全确定如何使用它......!
这是我用于CommonCrypto的模块地图 - $(SDKROOT)
在构建阶段被换出到正确的位置(适用于iphoneos
或iphonesimulator
SDK):
module CommonCrypto [system] [extern_c] {
umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
这种方式很好(除了你可以'#34;去定义"但我不介意),以便在FrameworkA
/ FrameworkB
中使用。< / p>
答案 0 :(得分:6)
免责声明:我没有为CommonCrypto
尝试此操作,但它适用于libz
的案例
可能的解决方案是按照Clang documentation
中的说明创建module.private.modulemap
例如,在FrameworkA中,您可以为FrameworkA编写module.modulemap
文件,如下所示:
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中的私有模块,名称不会发生冲突。