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

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

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)

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

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

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

15
задан Rui Peres 10 July 2012 в 13:03
поделиться

2 ответа

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

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

0
ответ дан 1 December 2019 в 01:53
поделиться

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

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

31
ответ дан 1 December 2019 в 01:53
поделиться