2012-03-14 5 views
30

Я пишу статическую библиотеку, которая имеет зависимости от других библиотек (в моем случае SBJSON и ASIHTTPRequest).Лучшая практика для статических зависимостей библиотеки

Если я скомпилирую эти внешние зависимости в свою библиотеку, то я не могу связать их с другими библиотеками, в которых эти классы скомпилированы. Поскольку моя цель - создать набор статических библиотек для моей компании, которые можно импортировать в любую новую приложение, компиляция этих зависимостей в библиотеке, очевидно, не является вариантом.

Есть ли у кого-нибудь советы/рекомендации по созданию набора общих статических библиотек с общими зависимостями?

+0

Почему бы не использовать dinamyc библиотеку вместо этого? – LuisEspinoza

+0

ОК, что не поддерживается – LuisEspinoza

+3

(A) Это довольно бесполезно для этого вопроса - моя проблема заключается в том, чтобы избежать дублирования символов-дубликатов. Как насчет символов SBJSON? (B) Они этого не делают. У них просто есть мнение об этом. (C) ASI - довольно часто используемая и реально протестированная библиотека - мой код почти наверняка более глючит. Даже принятый ответ из вопроса, на который вы ссылаетесь, содержит ошибки! – deanWombourne

ответ

9

Вы можете использовать менеджер зависимостей, как CocoaPods или VendorKit тянуть в нужной библиотеке, а также все это транзитивные зависимости - библиотеки, библиотека зависит.

Работа менеджера зависимостей для управления любыми конфликтами в транзитивных зависимостях - например, если в двух библиотеках используются разные версии SBJSON, это сработает, что делать. Все, что вам нужно сделать, это объявить библиотеку верхнего уровня, которую вы хотите в файле конфигурации, и будет работать над тем, какие под-библиотеки необходимы и вытащить их в ваш проект Xcode.

CocaoPods имеет хороший способ управления этим, потянув все библиотеки в качестве источника, а затем скомпилировать их все в одну статическую библиотеку - в отдельный проект. Затем он соединяется с вашим проектом через рабочее пространство.

VendorKit использует аналогичный подход, но использует один файл проекта.

Как CocoaPods, так и VendorKit позволяют вам легко публиковать свою библиотеку в центральном репозитории. CocaoPods позволяет вам поддерживать свою собственную или общедоступную вилку центрального репо, если хотите, то есть в качестве репозитория предприятия.

В большинстве случаев это избавит вас от неприятностей. В редких случаях ваша библиотека может зависеть от очень конкретной, более старой версии другой общей библиотеки. В этом случае вы можете использовать инструмент для переименования всех файлов header/impl в этой библиотеке, чтобы избежать коллизий.

[Изменить]: По состоянию на январь 2013 года появился новый соперник - плагин Maven Xcode.

13

Статическая библиотека - это всего лишь коллекция объектных файлов. В вашем случае вы не хотите, чтобы объектные файлы для SBJSON и ASIHTTPRequest были включены в вашу статическую библиотеку - вы хотите оставить это задание в конечном приложении. Единственное, что нужно для вашей статической библиотеки, это файлы заголовков для SBJSON и ASIHTTPRequest.

Поскольку эти проекты распространяются как файлы-источники (файлы .h и .m), вам просто нужно указать Xcode не создавать файлы .m-файлов SBJSON/ASIHTTPRequest для вашей цели статической библиотеки.

Самый простой способ сделать это - импортировать файлы заголовков .h для этих проектов в проект Xcode. Кроме того, вы можете импортировать файлы .h и .m, но убедитесь, что.м файлы не включены в «Источники Compile» построить этап вашей статической целевой библиотеки

Некоторые другие соответствующие С.О. темы:

How can I avoid "duplicate symbol" errors in xcode with shared static libraries?

Duplicate symbol: Include static lib A in static lib B, also include lib A and B in XCode Project

+0

Но что, если мой статический lib использует более старую версию sbjson - 3.0.4, а новый проект использует 3.1? он имеет те же файлы m, но разные h-файлы, или один использует ARC, а другой нет? –

+0

Это очень простое и подходящее решение должно быть принятым ответом. Спасибо Бен за то, что он избавил меня от этой проблемы. – thgc

Смежные вопросы