2010-09-16 55 views
0

我正在開發iPhone應用程序。我對Xcode不熟悉,請耐心等待。我有iOS 4.1 Device SDK。當我在「Active ...」下拉框中選擇「Simulator」時,我的應用程序編譯時沒有錯誤,並在iPhone模擬器中運行。iOS4.1 SDK中單個庫的重複符號

當我選擇在下拉框中的「設備」,但是,我得到關於重複的符號下面的鏈接器錯誤:

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開發新手。

回答

5

當你的編譯成靜態庫和參考彼此的項目網絡,有2所不同的關注,必須考慮:

  • 一個項目的直接依賴通知的Xcode哪些項目依賴彼此之間,所以它知道重新編譯項目時,其依賴關係發生變化。

  • 一個項目的鏈接的Libaries實際上包含在它的目標代碼中。

簡而言之,可以爲你的糾結直接依賴的網站,只要你想,但你必須小心每個項目的代碼鏈接到應用程序的可執行一次

基本上,我的問題是我有3個項目A,B和C,依賴關係看起來像A => B,A => C,B => C。我將libC.a鏈接到A和B,所以鏈接器抱怨重複的代碼。

您需要更改的配置資料位於Target Info頁面上,供您的每個項目目標使用。

2

這發生在我身上時,我使用了-all_load鏈接器標誌,它強制鏈接器加載所有庫中的所有符號。 Three20項目說你應該使用它,因爲否則類別不會被加載,你會得到一個運行時異常。我刪除了該標誌,併爲每個需要它的庫(Three20庫)添加了-force_load標誌。另請參閱:What does the -all_load linker flag do?

0

我有幾個應用程序需要嵌入一個使用ASI和TBXML的小型自定義庫。其中一些應用程序擁有自己的版本。爲了避免重複的符號問題,我複製了每個庫的目標,刪除導致問題的.m文件。 希望它有幫助。