У меня есть следующая настройка проекта:
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
? Или какой-нибудь обходной путь, который не требует добавления импорта в конкретный заголовочный файл, а глобально?