Как обработать дубликат ошибки символа из сторонних библиотек? - PullRequest
15 голосов
/ 26 мая 2010

У меня есть две сторонние библиотеки, которые, кажется, используют один и тот же класс. Это должно быть хорошо, но я получаю этот тип ошибки при сборке:

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o)

Как я могу решить эту проблему ...

- РЕДАКТИРОВАТЬ -

... если исходные файлы недоступны?

Ответы [ 3 ]

31 голосов
/ 26 мая 2010

Я собираюсь предположить, что это две сторонние библиотеки, которые предоставили вам только файлы .a, а не исходный код.Вы можете использовать libtool, lipo и ar на терминале для извлечения и рекомбинации файлов.

Чтобы увидеть, какие архитектуры находятся в файле:

$ lipo -info libTapjoy.a
Architectures in the fat file: libTapjoy.a are: armv6 i386

Затем, чтобы извлечь, например, только armv6:

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a
$ mkdir armv6
$ cd armv6
$ ar -x ../libTapjoy-armv6.a

Затем вы можете извлечь ту же архитектуру из другой библиотеки в тот же каталог и затем рекомбинировать их следующим образом:

$ libtool -static -o ../lib-armv6.a *.o

И, наконец, после того, как вы сделалиэто с каждой архитектурой, вы можете объединить их снова с lipo:

$ cd ..
$ lipo -create -output lib.a lib-armv6.a lib-i386.a

Это должно избавить от любых дублирующих символов, но также объединит две библиотеки в одну.Если вы хотите сохранить их отдельно или просто удалить дубликаты из одной библиотеки, вы можете соответствующим образом изменить процесс.

1 голос
/ 20 апреля 2013

Ответ Кори Килгера - правильный путь ... просто небольшая хитрость, поскольку у меня нет репутации, чтобы комментировать.

В моей системе Mac OS 10.8 эта команда lipo используется для создания файлов .a для использования с ar:

lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a

Страница руководства для lipo сообщает, что -extract и -extract_family создают универсальные файлы .a, и моя команда ar ничего из них не извлечет.

0 голосов
/ 26 мая 2010

Если у вас есть источники для обеих статических библиотек, создайте одну из них без класса CJSONScanner.Если вы этого не сделаете, вы можете использовать «ar» из командной строки для извлечения CJSONScanner.o из одной из библиотек.

Возможно, есть некоторый магический флаг, который вы можете передать «ld», чтобы это исправить,Я не знаю это от руки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...