2012-12-01 37 views
4

設置:
的Xcode 4.5.2(4G2008a)
OS X 10.7.5iOS UnitTests:無法鏈接到我的應用程序目標中的符號。怎麼了?


我有一個正常的iOS Application目標的Xcode項目。我試圖添加ApplicationTests單元測試包(不是LogicTests包)作爲described by Apple's documentation

我仔細地遵循了文檔中提供的步驟,並重新檢查了幾次。但是,我無法構建ApplicationTests目標...嘗試鏈接到我的Appliation類時,發生鏈接器錯誤時失敗。看起來好像設置構建設置的ApplicationTests目標不起作用。但是AFAICT,我正確地設置了這一點,正如Apple的文檔所述。


我的步驟TO攝製:

  1. 按照Apple's documentation for setting up an ApplicationTests bundle
  2. ApplicationTests目標中編寫單元測試方法,該目標從Application目標(例如MyAppClass)導入和練習類。
  3. 在運行目的地彈出
  4. Product>Test

預期選擇的方案彈出的應用目標和iPhone 6.0模擬器:
模擬器應啓動和我ApplicationTests應該運行。

實際:
ApplicationTests目標構建失敗,以下錯誤:

Undefined symbols for architecture i386: 
    "_OBJC_CLASS_$_MyAppClass", referenced from: 
     objc-class-ref in ApplicationTests.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

如果我在單元測試中刪除對MyAppClass引用文件,其ApplicationTests束將建成併成功運行。

同樣,我似乎沒有在我的ApplicationTests目標中正確設置Bundle Loader構建設置,但我已重新檢查,並且我似乎正確地遵循了Apple的說明。

如果我的ApplicationTests目標無法鏈接到我的Application目標中的符號,我該怎麼做?


更新:我也試圖與ApplicationApplicationTests目標從頭開始創建新的虛擬項目。在虛擬項目中,我向Application目標添加了一個MyAppClass類,並且能夠鏈接到該目標,併成功運行在虛擬ApplicationTests目標中使用MyAppClass的單元測試。

因此,我的虛擬項目中的應用測試工作。但他們不適合我的真實項目。我將虛擬和實際項目中的目標進行了比較,但無法找到明顯的差異,這隻會導致我的真實項目出現此問題。

我的真實項目已經很老了(但也非常複雜,所以很難重新開始)。我想知道該項目的老舊程度是否阻止了這個相對較新的功能的運作?

它在我看來仍然像我在我的真實項目的目標之一中有一個構建設置問題。但我找不到它。

+0

MyAppClass是否也編譯爲ApplicationTests目標? – Moxy

+0

@Moxy,實際上,沒有。未選擇MyAppClass作爲要編譯到ApplicationTests目標中的文件。但是,如Apple的文檔所述,創建「應用程序測試」目標(而不是「邏輯測試」目標)時不一定要這樣做。 (http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/UnitTesting/02-Setting_Up_Unit_Tests_in_a_Project/setting_up.html#//apple_ref/doc/uid/TP40002143-CH3-SW1) –

+0

您可以驗證在構建日誌中,當您「爲測試構建」時,-bundle_loader標誌正確傳遞?您是否將應用程序目標添加爲測試目標的依賴項? –

回答

1

你可以嘗試用Xcode 5.0打開項目嗎?在項目/目標設置中選擇單元測試目標,打開「常規」選項卡並檢查選定的「目標」是否是您的主要應用目標。

這就是Xcode獲取鏈接到單元測試軟件包加載器的信息的地方。

+0

是的,'MyAppTests'>'General'''' Target'設置爲'MyAppProject'。 –

+0

順便說一句,不知道是否重要,但我的主要'應用程序目標'實際上是一個'靜態庫'目標。 OPP沒有具體說明,但我會問這裏是否也一樣。 –

1

相關問題:Unit Testing in With A Static Library

總之,無論使用SenTest或XCTest,你需要確保

  • 你的主要項目已被設置爲測試目標的依賴

  • 如果您的主要目標是靜態庫,您的主要目標的庫產品需要包含在您的測試目標的link with binary libraries構建階段中

缺少這兩個(或兩者)都可能導致此錯誤。

+0

OP在這裏。我的項目符合您的第一個標準(我根據Apple的說明正確設置了測試目標)。至於你的第二個標準:我的主要目標不是一個靜態庫。如上所述,它是一個* App *。 –

+0

是的,這聽起來像我們的設置有點不同。希望如果將來有人發現這個問題,並且具有與我相似的設置,這可能對他們有幫助。對不起,它沒有解決你的問題。 :/ –

相關問題