Недавно столкнулся с необходимостью создания статической библиотеки (static library) в iPhone SDK. Обнаружил, что этот процесс достаточно плохо документирован, поэтому предлагаю вашему вниманию пошаговое руководство по созданию и использованию статических библиотек в iPhone SDK.
Для описания процесса создания статической библиотеки я использовал материалы статьи «Building static libraries with the iPhone SDK» и немного личного опыта.
Исходная точка: готовый проект, в котором часть функционала вы хотите вынести в отдельную библиотеку.
1) В вашем Xcode проекте в секции «Targets» правым кликом добавляем новый target:
В открывшемся окне выбираем Static Library:
Задаем имя библиотеки, например TestStaticLib.
2) Переносим существующие .m файлы в нашу библиотеку. Не нужно добавлять .h файлы.
3) Удаляем файлы, которые мы перенесли в библиотеку, из нашего проекта:
4) Добавляем ссылку на библиотеку в вкладке «General» свойств нашего приложения:
Замечание: Если мы меняем что-то в исходном коде библиотеки, то необходимо сначала перекомпилировать ее, а потом уже само приложение. Перекомпиливать библиотеку вручную не обязательно, если добавить библиотеку не в Linked Libraries, а в Direct Dependencies.
5) В вкладке Build в секции Linking добавляем флаг "-ObjC" в «Other Linker Flags». Это нужно лишь в том случае, когда ваша статическая библиотека определяет Objective-C классы, которые будет использовать ваше приложение:
Замечание: флаг "-ObjC" не особо важен, пока в библиотеке нет ничего Objective-C specific, но стоит добавить в библиотеку, например, категории для какого-то класса — сразу возникает run-time exception. Причина — отсутствие флага -ObjC для линкера. Детальнее это описано здесь.
6) Компилируем библиотеку.
7) Компилируем приложение.
Общие замечания:
1. После того, как библиотека скомпилировалась, то исходный код можно из нее удалить.
2. Если библиотека и приложение, которое ее использует, скомпилированы для разных target (например, библиотека — release для симулятора, приложение — debug для устройства), то, наверняка, вы получите ошибку компиляции. В таких случаях нужно использовать несколько вариантов библиотеки или компилировать под одинаковые targets.
3. В результате компиляции библиотеки получим файл с расширением .a — это и есть наша статическая библиотека.
1). Создаем новое приложение, например LinkingLibraryDemo:
2). Добавляем нашу *.a библиотеку (Add-> Existing Files->Navigate to the file -> Check “Copy items into destination group’s folder (if needed)” checkbox):
3). Идем в Targets, двойной клик – откроется окно Target Info. В вкладке General в секции Linked Libraries вы увидите подключаемую библиотеку.
4). В вкладке Build в секции Linking section нужно добавить флаг "–ObjC" в Other Linker Flags.
5). Добавляем все необходимые *.h файлы в проект.
После этих действий можно использовать библиотеку.
P.S. C первого взгляда может показаться, что все очень просто, но мне пришлось долго повозиться для того, чтобы понять нюансы работы с статическими библиотеками. Надеюсь, кому-то эта статья поможет сэкономить время.
Спасибо за внимание!
Создание статической библиотеки
Для описания процесса создания статической библиотеки я использовал материалы статьи «Building static libraries with the iPhone SDK» и немного личного опыта.
Исходная точка: готовый проект, в котором часть функционала вы хотите вынести в отдельную библиотеку.
1) В вашем Xcode проекте в секции «Targets» правым кликом добавляем новый target:
В открывшемся окне выбираем Static Library:
Задаем имя библиотеки, например TestStaticLib.
2) Переносим существующие .m файлы в нашу библиотеку. Не нужно добавлять .h файлы.
3) Удаляем файлы, которые мы перенесли в библиотеку, из нашего проекта:
4) Добавляем ссылку на библиотеку в вкладке «General» свойств нашего приложения:
Замечание: Если мы меняем что-то в исходном коде библиотеки, то необходимо сначала перекомпилировать ее, а потом уже само приложение. Перекомпиливать библиотеку вручную не обязательно, если добавить библиотеку не в Linked Libraries, а в Direct Dependencies.
5) В вкладке Build в секции Linking добавляем флаг "-ObjC" в «Other Linker Flags». Это нужно лишь в том случае, когда ваша статическая библиотека определяет Objective-C классы, которые будет использовать ваше приложение:
Замечание: флаг "-ObjC" не особо важен, пока в библиотеке нет ничего Objective-C specific, но стоит добавить в библиотеку, например, категории для какого-то класса — сразу возникает run-time exception. Причина — отсутствие флага -ObjC для линкера. Детальнее это описано здесь.
6) Компилируем библиотеку.
7) Компилируем приложение.
Общие замечания:
1. После того, как библиотека скомпилировалась, то исходный код можно из нее удалить.
2. Если библиотека и приложение, которое ее использует, скомпилированы для разных target (например, библиотека — release для симулятора, приложение — debug для устройства), то, наверняка, вы получите ошибку компиляции. В таких случаях нужно использовать несколько вариантов библиотеки или компилировать под одинаковые targets.
3. В результате компиляции библиотеки получим файл с расширением .a — это и есть наша статическая библиотека.
Использование библиотеки в новом приложении
1). Создаем новое приложение, например LinkingLibraryDemo:
2). Добавляем нашу *.a библиотеку (Add-> Existing Files->Navigate to the file -> Check “Copy items into destination group’s folder (if needed)” checkbox):
3). Идем в Targets, двойной клик – откроется окно Target Info. В вкладке General в секции Linked Libraries вы увидите подключаемую библиотеку.
4). В вкладке Build в секции Linking section нужно добавить флаг "–ObjC" в Other Linker Flags.
5). Добавляем все необходимые *.h файлы в проект.
После этих действий можно использовать библиотеку.
P.S. C первого взгляда может показаться, что все очень просто, но мне пришлось долго повозиться для того, чтобы понять нюансы работы с статическими библиотеками. Надеюсь, кому-то эта статья поможет сэкономить время.
Спасибо за внимание!