web-dev-qa-db-ja.com

フレームワークのプライベートモジュールマップ

私は この答え を使用して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で使用する場合、正常に機能します(ただし、「定義に移動」することはできませんが、問題ありません)。

16
Rich

免責事項CommonCryptoでこれを試したことはありませんが、libzを使用した私の場合は機能します

これに対する可能な解決策は、module.private.modulemapClangドキュメント で説明されています

したがって、たとえば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の両方のプライベートモジュールであり、名前が競合することはありません。

6
tmpz