私は この答え を使用して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 show private
属性 ですが、これをモジュールマップのどこに配置するのかわからないので、この目的には向かないかもしれません! export
属性 もあります使い方がよくわかりません...!
これは、私がCommonCryptoに使用しているモジュールマップです。$(SDKROOT)
は、ビルドフェーズで正しい場所にスワップアウトされます(iphoneos
またはiphonesimulator
SDKの場合):
_module CommonCrypto [system] [extern_c] {
umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
_
これは、FrameworkA
/FrameworkB
で使用する場合、正常に機能します(ただし、「定義に移動」することはできませんが、問題ありません)。
免責事項:CommonCrypto
でこれを試したことはありませんが、libz
を使用した私の場合は機能します
これに対する可能な解決策は、module.private.modulemap
Clangドキュメント で説明されています
したがって、たとえばFrameworkAでは、module.modulemap
FrameworkAのファイルは次のようになります。
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の両方のプライベートモジュールであり、名前が競合することはありません。