关于xcode:框架的私有模块映射

Private module map for a framework

我正在使用这个答案创建一个模块映射来为CommonCrypto创建一个模块,这样我就可以在框架中使用它。

但是,这样做意味着我使用此框架的任何项目都可以使用import CommonCrypto访问CommonCrypto - 更糟糕的是,在另一个框架中声明CommonCrypto并将其导入项目会导致Redefinition of module 'CommonCrypto'错误。

即以下设置:

1
2
3
MainProject
    |--> import FrameworkA - module map for CommonCrypto
    |--> import FrameworkB - module map for CommonCrypto

有没有办法创建模块映射,但是将其创建/使用的框架私有? (与Swift for a Framework中的internal access属性非常相似)。
llvm Clang文档显示了一个private属性,但是我无法确定将它放在我的模块映射中的位置,它甚至可能不是为了这个目的!
还有一个export属性,但我再也不确定如何使用它......!

这是我用于CommonCrypto的模块映射 - $(SDKROOT)在构建阶段被换出到正确的位置(对于iphoneosiphonesimulator SDKs):

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

这工作正常(除了你不能"去定义"但我不介意)用于FrameworkA / FrameworkB


免责声明:我没有尝试过CommonCrypto,但它适用于libz的情况

可能的解决方案是创建一个module.private.modulemap,如Clang文档中所述

因此,例如在FrameworkA中,您可以为FrameworkA编写module.modulemap文件,如下所示:

1
2
module FrameworkACommon {
}

然后你会像这样创建一个module.private.modulemap文件

1
2
3
4
5
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中的私有模块,名称不会冲突。