Подтвердить что ты не робот

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

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

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)

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

- EDIT -

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

4b9b3361

Ответ 1

Я собираюсь предположить, что это две сторонние библиотеки, которые предоставили вам только файлы .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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Вероятно, есть какой-то волшебный флаг, который вы можете передать "ld", чтобы исправить это, но я не знаю этого.