Как создать фреймворк из библиотеки C с вложенными заголовками - PullRequest
0 голосов
/ 21 июня 2020

Я хочу создать фреймворк iOS для популярной библиотеки C.

Моя текущая настройка:

Это то, что я делаю:

  1. Создайте библиотеку для архитектур симуляторов iOS и iPhone
  2. Объедините два архива .a файлов в одну толстую библиотеку, используя lipo
  3. Используйте libtool -static -o, чтобы получить финальную библиотеку

На этом этапе у меня есть двоичный файл и куча файлов заголовков. В xcode:

Отбросьте двоичный файл (с шага 3) и убедитесь, что он связан под: Target > General > Framework and Libraries и Target > Build Phases > Link Binary with Libraries

Я копирую все файлы заголовков из C библиотеки и поместите их в каталог Dependencies/myClibrary/include/. Каталог include содержит главный файл заголовка myClibrary.h, который включает несколько файлов заголовков из ./abstract/*.h.

На верхнем уровне каталога проекта xcode я также создаю module.map файл с содержимым:

module MyWrapperFramework [system] {
  header "Dependencies/myClibrary/include/myClibrary.h"
  export *
}

Добавить все файлы заголовков в xcode и для каждого файла заголовка под Target Membership изменить значение с project на public.

Сборка

Тестирование фреймворка в приложении

Я могу создать фреймворк с указанными выше настройками. Однако, когда я хочу протестировать его в тестовом приложении Objective C, я импортирую фреймворк и вызываю функции, связанные с myClibrary. При создании приложения я получаю сообщение об ошибке:

'myClibrary/abstract/headername.h' file not found

Вышеупомянутая ошибка возникает из главного файла заголовка myClibrary myClibrary.

Большая часть учебника, который я смог найти имеет дело с C библиотеками, имеющими один файл заголовка. Как я могу создать фреймворк iOS из библиотеки C, содержащей файлы вложенных заголовков?

В случае, если вложенные файлы заголовков не являются здесь основной проблемой, что я делаю не так?

1 Ответ

1 голос
/ 22 июня 2020

Заголовки фреймворка устанавливаются в каталог Headers внутри .framework. Компилятор знает достаточно magi c, чтобы, когда вы говорите #import что он запустит поиск myClibrary.h внутри этого каталога заголовков.

В результате правила сборки заголовка publi c по умолчанию копируют все файлы publi c .h (независимо от их положения в исходном дереве) в этот каталог заголовков. Этот каталог должен быть установлен как переменная $ PUBLIC_HEADERS_FOLDER_PATH во время сборки.

Кажется, что вам нужно установить заголовки в разные каталоги. Вы можете просто установить значение Путь к папке Publi c Headers в настройках сборки как подкаталог, который затем установит туда все заголовки publi c. Затем у вас может быть настраиваемая фаза сборки Copy Files, чтобы установить только один общий заголовок в исходный каталог заголовков.

Или вы можете просто добавить только заголовки, которые go в root как publi c заголовков, а затем для всех остальных имеется настраиваемая фаза копирования файлов, которая копирует их в настраиваемый подкаталог. Я думаю, что если вы выберете «Wrapper» в качестве пункта назначения, это будет root фреймворка, поэтому, если подпуть - «Headers / abstract», это должно работать (хотя я сам не тестировал). Если вам нужно иметь несколько подкаталогов, вам понадобится настраиваемая фаза сборки Copy Files для каждого из них.

Или, конечно, иметь собственный сценарий сборки, чтобы копировать заголовки вручную, если это проще, чем сборка нескольких фазы (скажем, тот, который копирует все файлы из каталога include в $ PUBLIC_HEADERS_FOLDER_PATH, но с сохранением структуры, если подкаталогов много).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...