2014-10-16 2 views
2

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

У меня нет контроля над старой/раздвоенной версией библиотеки, но я могу скомпилировать новую версию, но, пожалуйста.

Есть ли что-то, что я могу сделать для автоматического префикса/namespace символов в новой версии библиотеки, чтобы я мог использовать их, не сталкиваясь с символами в старой версии?

+0

Вы можете перенести код, который * использует * статическую библиотеку в свою собственную структуру, эффективно обертывая статический библиотечный код с акцентом на ваши собственные потребности. Это, безусловно, избегало бы столкновения символов. – Droppy

+0

@Benjamin Вы нашли решение? Я был бы рад сделать некоторые предложения. – raurora

+0

@raurora На самом деле, я смог что-то сделать в соответствии с тем, что предложил Droppy. Тем не менее, это интересная проблема, поэтому, если у вас есть дополнительные предложения, которые вы хотели бы опубликовать, я был бы рад их услышать. –

ответ

3

Объединение информации из следующих сообщений перелива два стека:

и взглянуть на PLCrashReporter, я придумал следующее:

  1. Создайте новый проект Cocoa Touch Static «Wrapper» в XCode.

  2. Измените «Mach-O Type» новой статической библиотеки на «Relocatable Object File».

  3. Выберите, какую версию дублированной библиотеки вы не хотите отлаживать, то есть вам придется выбросить символы для одной копии дублированной библиотеки, поэтому вы не сможете отлаживать Это.

    В моем случае я решил выбросить символы для предварительно скомпилированной зависимости, которая принесла более старую версию библиотеки/символов. Я принял это решение, потому что предварительно скомпилированная зависимость от сторонней стороны, и в любом случае у нее не было символов отладки.

  4. В новом Cocoa Touch проект «обертка» включить «Выполнение одного объекта Pre-Link» и «Заполнить Prelink библиотеки» с относительным путем к библиотеке/зависимость вы выбрали, чтобы не быть в состоянии отладки.

  5. Я подозреваю, что этот шаг на самом деле не требуется, но я сделал это, потому что он, казалось, сделал мои намерения более явными (в отношении настроек сборки).

    Set «Символы по умолчанию скрыты» в «Да» в проекте «Упаковочный», а затем отметьте все классы Objective-C, C методы ++/классы и т.д. Вы намерены экспортировать с:

    атрибут ((видимость («по умолчанию»)))

  6. в проекте «Упаковочный» набор «Развертывание Препроцессирование» на «Да» и «Газа Стиль» к «Неглобальные символы»(в нашем случае это вызвало Объективные категории C в библиотеке должны быть неправильно опущены).

  7. Запись классов Objective-C (код C или C++ будет работать одинаково хорошо), чтобы обернуть нужные вам функции из зависимостей (символы которых должны быть отброшены) и выставить небольшой API (для использования в вашем оригинальный проект).

  8. Этот шаг был для меня ключом - добавьте Exported Symbols File и в нем точно укажите, какие символы вы хотите экспортировать (т. Е. Упомянутый выше небольшой API). Задайте параметры сборки «Exported Symbols File» как относительный путь к этому файлу (снова в проекте «Wrapper»).

  9. Перейдите в исходный проект, удалите зависимостей, которые вы только что создали API-интерфейсы обертки, из «Build Binary with Libraries» и замените его новой библиотекой-оберткой. Вам также потребуется обновить любой код в вашем проекте, чтобы использовать новый API-интерфейс обертки.

  10. Если вы еще этого не сделали, добавьте новую версию библиотеки/библиотек (которые ранее вызывали конфликты символов) в основной проект и используйте эти API в соответствии с нормальным.

+0

Добро пожаловать. – Droppy