Связывание статических библиотек, совместно использующих статическую библиотеку

В настоящее время у меня есть один проект Xcode для очень большой базы кода, я назову его Project X, который я разделяю на кучу субпроектов (Проекты A, B, C).

Пока, каждый из этих проектов компилируется сам по себе, просто отлично. Все они создают статические библиотеки. Проект B и Проект C зависят от статической библиотеки, созданной Project A для сборки.

У меня есть другой проект xcode, Проект Z, для которого требуются статические библиотеки, созданные Проекты B и C. В этом и заключается проблема. Когда Проект Z входит в фазу компоновщика, все в порядке - дублируются символы в libs для Проекты B и C для кода, изначально связанного с ним в Проекте А

Я новичок в мире статических библиотек, и я не уверен, как продвигаться вперед с помощью Project Z, или как изменить другие проекты, чтобы они связывались с тот же Проект A lib. У меня такое чувство, что это невозможно. Какие у меня варианты?

Edit:

Я должен уточнить, что Проект B и Проект C необходимо встроить в отдельные статические библиотеки, потому что некоторым клиентам потребуется только один или другой.

Кроме того, у меня есть эта дилемма как на платформах OSX, так и на iOS.

Я понимаю, что я мог решить эту проблему на OSX, построив проекты как динамические библиотеки. Тем не менее, я бы предпочел не делать этого, и это все равно оставляет мне ту же проблему на iOS.

Ответ 1

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

В каждой статической библиотеке должен быть только собственный код. Заключительное приложение отвечает за объединение всех необходимых библиотек (включая библиотеки, требуемые библиотеками). Таким образом, имеется одна копия каждой связанной вещи.

Ответ 2

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