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)在构建阶段被换出到正确的位置(对于iphoneos或iphonesimulator SDKs):
1 2 3 4
| module CommonCrypto [system] [extern_c] {
umbrella header"$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h"
export *
} |
这工作正常(除了你不能"去定义"但我不介意)用于FrameworkA / FrameworkB。
-
嗨,有没有更新? 我对libz有相同的确切设置:(
-
Rich,你能否提供替换$(SKROOT)的构建阶段脚本? 谢谢!
-
@appleitung:脚本在这里:gist.github.com/rhodgkins/5eecee8bcbdb6021fc798247132e9fa7,然后在项目中将其设置为:postimg.org/image/fj7j9nsqp。 别忘了将目录$(PROJECT_DIR)/ $(TARGET_NAME)/ ExternalFrameworks /添加到* Framework Search Paths构建设置中。 然后,所有模块映射应位于输入目录文件夹中 - 文件夹名称包含modulemap作为名称。
免责声明:我没有尝试过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中的私有模块,名称不会冲突。
-
太好了!谢谢分享 - 我会试试!
-
@tmpz我很多地使用了未申报的类型....你有没有遇到过这种情况?
-
您可能会收到未声明的类型,因为您的模块未导出任何标头。 export *会将标头导出到FrameworkACommon并导入它,你必须写FrameworkACommon.Crypto但它会停在那里。在FrameworkACommon之后,导出的标题不可见,它们现在是内部的。
-
有没有办法让这种东西使用CocoaPods工作?我已尝试过使用modulemaps的一些东西,但我似乎无法让它工作
-
@cjwirth您可以为CocoaPod规范指定模块映射。
-
这是一个错字:"在FrameworkA中你可以为CommonCrypto编写一个module.modulemap文件,就像这样"。这是否意味着"在FrameworkA中你可以像这样为FrameworkA编写module.modulemap文件"?
-
@hnh这是一个错字。固定。
-
努力使这与Xcode 8一起工作:-)你给出的模块映射,你不只是将它们添加到Swift导入路径,你还将它们设置为目标中的"模块映射文件"和"私有模块映射文件" , 对?此外,你的说法"模块FrameworkACommon {}",给定问题的设置,是另一个错字,应该是"模块FrameworkA"和"显式模块"FrameworkA.CommonCrypto"?
-
你能检查一下:stackoverflow.com/q/56769304/1364053