Дубликат символа из одной библиотеки в iOS4.1 SDK - PullRequest
0 голосов
/ 17 сентября 2010

Я занимаюсь разработкой приложения для iPhone.Я незнаком с Xcode, поэтому, пожалуйста, потерпите меня.У меня есть iOS 4.1 Device SDK.Когда я выбираю «Симулятор» в раскрывающемся списке «Активный ...», мое приложение компилируется без ошибок и запускается в симуляторе iPhone.

Когда я выбираю «Устройство» в раскрывающемся списке,однако я получаю следующую ошибку компоновщика относительно дублированного символа:

Ld build/PineCone.build/Debug-iphoneos/PineCone.build/Objects-normal/armv6/PineCone normal armv6
cd /Users/isaacsutherland/fydp/PineCone/PineCone
setenv IPHONEOS_DEPLOYMENT_TARGET 4.1
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.1.sdk -L/Users/isaacsutherland/fydp/PineCone/PineCone/build/Debug-iphoneos -L/Users/isaacsutherland/fydp/PineCone/PineCone/../3rd/libGHUnitIPhone -F/Users/isaacsutherland/fydp/PineCone/PineCone/build/Debug-iphoneos -filelist /Users/isaacsutherland/fydp/PineCone/PineCone/build/PineCone.build/Debug-iphoneos/PineCone.build/Objects-normal/armv6/PineCone.LinkFileList -dead_strip -all_load -ObjC -miphoneos-version-min=4.1 -framework Foundation -framework UIKit -framework CoreGraphics /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20.a /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20Core.a /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20Network.a /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20Style.a /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20UI.a /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20UICommon.a /Users/isaacsutherland/fydp/PineCone/3rd/three20/Build/Products/Debug-iphoneos/libThree20UINavigator.a -framework QuartzCore -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -lz.1.2.3 /Users/isaacsutherland/fydp/PineCone/ClientDal/build/Debug-iphoneos/libClientDal.a -lGHUnitIPhone4_0 -o /Users/isaacsutherland/fydp/PineCone/PineCone/build/PineCone.build/Debug-iphoneos/PineCone.build/Objects-normal/armv6/PineCone

ld: duplicate symbol _RedirectionLimit in /Users/isaacsutherland/fydp/PineCone/ClientDal/build/Debug-iphoneos/libClientDal.a(libASIHTTPRequest.a-armv6-master.o) and /Users/isaacsutherland/fydp/PineCone/ClientDal/build/Debug-iphoneos/libClientDal.a(libASIHTTPRequest.a-armv6-master.o)
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Ошибка странная, потому что она жалуется, что _RedirectionLimit найден дважды - в одном и том же файле!libClientDal.a(libASIHTTPRequest.a-armv6-master.o) - это библиотека-нарушитель.Может ли кто-нибудь помочь мне понять, что происходит?Как эта библиотека могла правильно скомпилироваться?Или, возможно, компоновщик пытается включить одну и ту же библиотеку дважды?

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

Если вам нужна дополнительная информацияЯ с удовольствием предоставлю это - как я уже сказал, я новичок в разработке Xcode.

Ответы [ 3 ]

5 голосов
/ 19 октября 2010

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

  • Прямые зависимости проекта информируют XCode, какие проекты зависят друг от друга, поэтому он знает, как перекомпилировать проект при изменении его зависимостей.

  • Связанные библиотеки проекта фактически включаются в его объектный код.

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

По сути, моя проблема заключалась в том, что у меня было 3 проекта A, B и C, и зависимости выглядели как A => B, A => C, B => C. Я связывал libC.a с A и B, поэтому компоновщик пожаловался на дублирующийся код.

Конфигурационные элементы, которые вам нужно изменить, находятся на странице Target Info для каждой цели вашего проекта.

2 голосов
/ 13 января 2011

Это случилось со мной, когда я использовал флаг компоновщика -all_load, который заставляет компоновщик загружать все символы из всех библиотек. Проект Three20 говорит, что вы должны использовать его, потому что в противном случае Категории не будут загружены, и вы получите исключение времени выполнения. Я удалил этот флаг и добавил флаг -force_load только для каждой библиотеки, которая нуждалась в ней (библиотеки Three20). См. Также: Что делает флаг компоновщика -all_load?

0 голосов
/ 21 ноября 2011

У меня есть несколько приложений, которым нужно встроить небольшую пользовательскую библиотеку, использующую ASI и TBXML.Некоторые из этих приложений имеют свои собственные версии этих библиотек.Чтобы избежать дублирования символов, я продублировал цель каждой библиотеки, удалив файлы .m, которые вызывают проблему.Надеюсь, это поможет.

...