Повторяющийся символ: включите статическую библиотеку A в статическую библиотеку B, а также включите библиотеку A и B в проект XCode - PullRequest
11 голосов
/ 10 марта 2011

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

Одна из моих статических библиотек - это набор методов общего использования (категории на базовых классах Objective-C, чтобы улучшить их удобство использования), которые я обычно использую в каждом проекте.(Мы назовем это Lib A ... то есть проект XCode A производит libProjectA.a)

Затем у меня есть другие статические библиотеки, вещи, которые содержат специализированный код для математики и т. Д. (Мы назовем это LibB.) Lib B связан с Lib A, потому что он должен использовать некоторые из этих общих функций.(т. е. проект XCode B связывается с libProjectA.a и создает libProjectB.a)

В моем проекте XCode я хочу включить и зависеть от Lib A, потому что в нем есть мои обычные вещи, которые я использую постоянноЯ также хочу включить и зависеть от Lib B, потому что мне нужна эта специализированная математическая функциональность.(т.е. мой проект приложения хочет связать с libProjectA.a и libProjectB.a)

Однако, когда я пытаюсь построить свой проект XCode, я получаю ошибки для дублированных символов, потому что символы, которые определены в Lib A, являютсятакже определено в Lib B.

ld: duplicate symbol _OBJC_METACLASS_$_Foo in /Users/kenny/xcode_build/Release-iphonesimulator/lib_ApplicationCore.a(Foo.o) and /Users/kenny/xcode_build/Release-iphonesimulator/lib_SpecializedMath.a(Foo.o)

Как обойти эту проблему?Я хочу разработать многократно используемые библиотеки, чтобы ускорить разработку приложений, а также повысить стабильность благодаря проверенному / усовершенствованному коду.Я подхожу к этому с неправильной точки зрения?Я разрабатываю для iOS, поэтому я не могу использовать dylibs, они должны быть статическими.

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

Ответы [ 2 ]

7 голосов
/ 10 марта 2011

Хотя Lib B зависит от Lib A, на самом деле вы не хотите помещать все объекты из A в B, что вы и сделали по внешнему виду.Я не уверен, как ты справился с этим, но я бы вообразил, когда ты построил Lib B, ты был связан с Lib A?Если это так, просто опустите Lib A в строке сборки для Lib B. Все символы из Lib A должны быть неопределенными в Lib B.

Статические библиотеки - это всего лишь архивы объектных файлов, поэтому они должныотдельный.Когда вам нужно установить связь с Lib B, просто укажите Lib A.

1 голос
/ 07 февраля 2013

В этой теме обсуждалось удаление дубликатов с помощью инструментов командной строки.

Как обработать ошибку дублирования символов из сторонних библиотек?

Они извлекли файлы .o внутрь.файлы и удалили дубликаты, затем снова объединены.

...