我正在开发一个iPhone应用程序。我对Xcode不熟悉,所以请耐心等待。我有iOS 4.1 Device SDK。当我在“Active ...”下拉框中选择“Simulator”时,我的应用程序编译没有错误并在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)
是违规图书馆。有人可以帮我理解发生了什么吗?这个库怎么能在第一时间正确编译?或者链接器可能试图包含两次相同的库?
this similar question中提供的解决方法对我不起作用。
如果您需要更多信息,我很乐意提供 - 就像我说的,我是Xcode开发的新手。
答案 0 :(得分:5)
当您拥有一个编译为静态库并相互引用的项目Web时,您必须考虑两个不同的问题:
项目的直接依赖关系告知Xcode哪些项目相互依赖,因此它知道在项目依赖项发生变化时重新编译项目。
项目的链接库实际上包含在其目标代码中。
简而言之,您的直接依赖关系网可以如您所愿,但您必须小心将每个项目的代码链接到应用程序可执行文件只能。
基本上,我的问题是我有3个项目A,B和C,并且依赖关系看起来像A => B,A => C,B => C.我将libC.a链接到A和B,因此链接器抱怨重复的代码。
您需要更改的配置内容位于每个项目目标的“目标信息”页面上。
答案 1 :(得分:2)
当我使用-all_load链接器标志时,这发生在我身上,这会强制链接器加载来自所有库的所有符号。 Three20项目说你应该使用它,因为否则不会加载Categories并且你得到运行时异常。我删除了那个标志,并为每个需要它的库(Three20库)添加了-force_load标志。另见:What does the -all_load linker flag do?
答案 2 :(得分:0)
我有几个应用程序需要嵌入一个使用ASI和TBXML的小型自定义库。其中一些应用程序有自己的库版本。为了避免重复的符号问题,我复制了每个库的目标,删除了导致问题的.m文件。 希望它有所帮助。