【发布时间】:2016-03-19 20:00:37
【问题描述】:
我正在使用 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 中的 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 *
}
在FrameworkA / FrameworkB 中使用这很好(除了你不能“去定义”,但我不介意)。
【问题讨论】:
-
嗨,这有什么更新吗?我对 libz 有相同的设置 :(
-
Rich,能否请您提供替换 $(SKROOT) 的构建阶段脚本?谢谢!
-
@appleitung:脚本在这里:gist.github.com/rhodgkins/5eecee8bcbdb6021fc798247132e9fa7 然后像这样设置它:postimg.org/image/fj7j9nsqp 在一个项目中。不要忘记将目录 $(PROJECT_DIR)/$(TARGET_NAME)/ExternalFrameworks/ 添加到 *Framework Search Paths 构建设置中。然后所有模块映射应位于输入目录文件夹中 - 包含模块映射的文件夹名称为名称。
标签: xcode swift frameworks dylib llvm-clang