Заголовки фреймворка из файла PCH не найдены при сборке в качестве подпроекта

У меня есть следующая настройка проекта:

1) Основной проект iOS ('суперпроект')... здесь ничего особенного, проект был построен поверх одного из шаблонов iOS по умолчанию из Xcode.

2) Второй проект ("подпроект"), созданный поверх шаблона статической библиотеки. Я добавил этот проект в суперпроект и создал ссылки на него из суперпроекта на этапах сборки «Целевые зависимости» и «Связать двоичный файл с библиотеками».

Внутри подпроекта у меня есть объявление функции C, которое выглядит так:

ABAddressBookRef myABAddressBookCreateWithOptions(CFDictionaryRef options, CFErrorRef * error);

Он задуман как замена/прокси одноименной функции из структуры AddressBook и использует тип (ABAddressBookRef) из этой структуры. Объявление хранится в заголовочном файле, а реализация существует в соответствующем файле .m. Чтобы сделать этот тип доступным, я добавил заголовок фреймворка в файл .pch моего подпроекта:

#ifdef __OBJC__
        #import <AddressBook/AddressBook.h>
        #import <Foundation/Foundation.h>
#endif

Возникает следующая проблема:

Если я соберу суперпроект (конфигурация выпуска или отладки), сборка завершится ошибкой с этим сообщением об ошибке:

.../ManagedCFunctions.h:24:1: Unknown type name 'ABAddressBookRef'

Что я сделал, чтобы решить проблему или, по крайней мере, получить представление о том, что происходит:

  • Сборка подпроекта отдельно работает (но последующая сборка суперпроекта все равно не работает)
  • Раскомментирование объявления избавляет от ошибки, но, естественно, вызывает предупреждение «Implicit Declaration of Function» в месте вызова.
  • Добавление импорта в файл .pch суперпроекта не помогает
  • Добавление импорта в заголовочный файл функции напрямую работает, но это не вариант в моем сценарии (части кода генерируются автоматически, и было бы трудно выяснить, какой файл нуждается в каких фреймворках)

Я подозреваю, что, возможно, файл заголовка обрабатывается не в режиме Objective-C, а в режиме C, поэтому импорт игнорируется из-за макроса #ifdef __OBJC__ вокруг импорта, но его удаление также не помогло. Я также попытался добавить #import <Foundation/Foundation.h> в заголовочный файл функции, чтобы «предложить» режим Objective-C, и это фактически включило правильную подсветку синтаксиса в файле, но не помогло для сборки.

Любые предложения относительно того, почему символ находится в файле .m, но не в файле .h? Или какой-нибудь обходной путь, который не требует добавления импорта в конкретный заголовочный файл, а глобально?


person hagi    schedule 12.04.2013    source источник


Ответы (1)


Сегодня я обнаружил проблему после того, как я в проекте -> Информация -> Конфигурации добавил файл конфигурации, затем я запускаю свой проект, в моем файле pch он идет не так.

Он показывает, что xxx.h не найден, я ищу много решений, но не могу найти правильный ответ. Так что я помню этот шаг.

Я удалил файл конфигурации, и мой проект стал нормальным.

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

person aircraft    schedule 08.08.2016