框架的私有模块映射

时间:2015-12-14 11:01:27

标签: xcode swift frameworks dylib llvm-clang

我使用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)在构建阶段被换出到正确的位置(适用于iphoneosiphonesimulator SDK):

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

这种方式很好(除了你可以&#39;#34;去定义&#34;但我不介意),以便在FrameworkA / FrameworkB中使用。< / p>

1 个答案:

答案 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中的私有模块,名称不会发生冲突。