Подтвердить что ты не робот

Личная карта модуля для каркаса

Я использую этот ответ, чтобы создать карту модуля для создания модуля для CommonCrypto, чтобы я мог использовать его в рамках.

Выполнение этого, однако, означает, что любые проекты, в которых я использую эту инфраструктуру, имеют доступ к CommonCrypto с import CommonCrypto - и еще хуже, объявляя CommonCrypto в другой структуре и импортируя это в проект, приводят к ошибкам Redefinition of module 'CommonCrypto'.

т.е. следующая настройка:

MainProject
    |--> import FrameworkA - module map for CommonCrypto
    |--> import FrameworkB - module map for CommonCrypto

Есть ли способ создать карту модуля, но она личная для этой Framework, которую она создала/использовала? (Очень похоже на атрибут доступа internal в Swift для платформы). llvm Clang docs показывают атрибут private но я не могу решить, где разместить это на моей карте модулей, и это может быть даже не для этой цели! Там также export атрибут, но опять же я не совсем уверен, как это использовать...!

Это моя карта модулей, которую я использую для CommonCrypto. $(SDKROOT) поменяется на фазе сборки в правильное место (для iphoneos или iphonesimulator SDK):

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

Это прекрасно работает (за исключением того, что вы не можете "перейти к определению", но я не против этого) для использования в FrameworkA/FrameworkB.

4b9b3361

Ответ 1

Отказ от ответственности. Я не пробовал это для 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, и имена не будут сталкиваться.