Проверить существование фреймворка во время компиляции?

Я работаю над проектом с открытым исходным кодом, который может при необходимости использовать структуру с закрытым исходным кодом. Если в проект включена инфраструктура с закрытым исходным кодом, будут добавлены дополнительные функции. Но если структура не включена в проект, проект все равно должен правильно компилироваться.

Как проверить время компиляции, если структура включена в проект?

В принципе, я хочу сделать что-то вроде этого:

#ifdef _MY_FRAMEWORK_EXISTS #import <MyFramework/MyFramework.h> #endif 

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

Я НЕ хочу проверять во время выполнения через NSClassFromString() , потому что это не удастся во время компиляции, когда я пытаюсь импортировать MyFramework и он не существует.

Вы можете проверить наличие файла заголовка, используя расширение __has_include. http://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros

Однако это говорит только о том, установлен ли файл заголовка. Он не может сказать вам, связана ли ссылка с бинарными связями с библиотеками.

Я рекомендую прочитать библиотеку разработчиков Mac: руководство по программированию на платформе (которое включает раздел « Слабая связь» ).

  1. Что вы подразумеваете под «существует» или «включено в проект»? Вы имеете в виду добавление в фазу сборки Link Binary With Libraries (как описано в разделе « Включение фреймворков» )? Все, что происходит, влияет на процесс компоновки, а не на сборку, сборку. Чтобы увидеть это, постройте. Затем -framework поиск -framework в журнале сборки -framework Log Navigator.

    Итак, да, если вы хотите повлиять на компиляцию кода, который вы предоставили, вы можете вручную определить макрос _MY_FRAMEWORK_EXISTS .

  2. Я не совсем понимаю, что вы пытаетесь сделать. Можете ли вы объяснить, что хотите на более высоком уровне? Возможно, есть лучший способ сделать это.

    «Минимальные накладные расходы» хороши, но слишком много магии может сбивать с толку. Например, магия Xcode скрывает то, что на самом деле происходит при включении фреймворка.

    Я также рекомендую проверить, как работает SDK для iOS для iOS для высоких и низкоуровневых идей. Это может сделать то, что вы хотите сделать.

  • Xcode 7 не автозаполняется при использовании заголовка моста
  • Swift Framework не включает символы из расширений в общие структуры
  • Выполнение запуска кода в iOS при загрузке фреймворка
  • Как создать инфраструктуру iOS со слабосвязанными библиотеками CocoaPods
  • Ошибка Xcode 7.1 PrototypeTools Linker (только на симуляторе)
  • Как создать файл Cartfile? Или легко добавить фреймворки в ваше приложение?
  • Использование iOS 7 для частного API
  • Использование LSApplicationWorkspace в Swift
  • Как создать инфраструктуру iOS с XCode 6
  • Универсальная пользовательская инфраструктура iOS с использованием Xcode 6.4
  • NSUserDefaults и инфраструктура / библиотека iOS
  • Давайте будем гением компьютера.