2013-06-17 4 views
14

मेरा एप्लिकेशन यूनिट परीक्षण सिम्युलेटर में चलते समय परीक्षण और परीक्षण करता है, लेकिन डिवाइस के निर्माण और परीक्षण करते समय लिंकर त्रुटि के साथ विफल रहता है।एक्सकोड यूनिट टेस्ट - डिवाइस के लिए निर्माण करते समय लिंक त्रुटि

अपने आवेदन लक्ष्य पर मैं निम्नलिखित निर्माण सेटिंग्स निर्धारित किया है:

DEPLOYMENT_POSTPROCESSING = NO 
GCC_SYMBOLS_PRIVATE_EXTERN = NO 

मेरी इकाई परीक्षण पर मैं निर्माण निम्न सेटिंग्स निर्धारित किया है:

BUNDLE_LOADER = $(BUILT_PRODUCTS_DIR)/<app name>.app/<app> 
TEST_HOST = $(BUNDLE_LOADER) 

लिंकर त्रुटि है:

Undefined symbols for architecture armv7s: 
"_<An NSString * const>", referenced from: 
     -[UnitTestClassA setUp] in UnitTestClassA.o 
"_<Another NSString * const>", referenced from: 
     -[UnitTestClassB helperMethod:] in UnitTestClassB.o 
     -[UnitTestClassB anotherHelperMethod:] in UnitTestClassB.o 
ld: symbol(s) not found for architecture armv7s 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

... मेरे पास एक्सकोड की वरीयताओं में "बिल्डिंग त्रुटियों के बाद जारी है" चालू है, लेकिन मुझे रिसी नहीं है एनएसएसटींग * कॉन्स के बारे में शिकायत करने वाले लिंकर त्रुटियों का एक टन है। अगर मैं कुछ गलत कर रहा हूं, तो मैं अपने उत्पादन कोड में स्ट्रिंग स्थिरांक का उपयोग करने के बाद से मुट्ठी भर से अधिक लिंक त्रुटियों की अपेक्षा करूंगा।

मैं इस तरह मेरी स्ट्रिंग स्थिरांक बना रहा हूं:

ज फ़ाइल ...

extern NSString * const ReallyGoodString; 

मीटर फ़ाइल ...

NSString * const ReallyGoodString = @"This string is great!"; 

... .m फ़ाइल उत्पादन कोड है, और मेरे आवेदन लक्ष्य का हिस्सा है, और इसलिए मुझे इसे यूनिट टेस्ट बंडल में लिंक करने की आवश्यकता नहीं है।

तो, यहां क्या हो रहा है? सिम्युलेटर में यह ठीक क्यों काम करता है, डिवाइस पर नहीं?

मैंने sample project to Github पोस्ट किया है जो समस्या को दर्शाता है। आप नमूना प्रोजेक्ट में देख सकते हैं कि यह समस्या असंगत है: कुछ प्रतीकों को ठीक से जोड़ता है अन्य लोग नहीं करते हैं।

+1

क्या आपने कभी यह पता लगाया है? मुझे एक ही समस्या है। यहां तक ​​कि अजनबी, यह पहले ठीक काम करता था, और लिंकर केवल हेडर फ़ाइल में एक स्ट्रिंग स्थिरता की शिकायत कर रहा है, जिससे अन्य प्रतीकों को ठीक लगता है। –

+0

@ जोनग्राल ने इसे अभी तक नहीं देखा है – edelaney05

उत्तर

27

जब लिंकर Linker-Error निष्पादन योग्य बना रहा है, तो यह FHKViewControllerThisSymbolWontLink को छोड़ देता है क्योंकि निष्पादन योग्य में कुछ भी इसका उपयोग नहीं करता है। लिंकर यह नहीं जानता कि इसे यूनिट टेस्ट बंडल द्वारा उपयोग किए जाने वाले प्रतीक को रखना चाहिए (जिसे रनटाइम पर गतिशील रूप से लोड किया जाता है)।

NSString * const FHKViewControllerThisSymbolWontLink __attribute__((used)) = @"name"; 

आप ऐसा करने के लिए कि प्रत्येक प्रतीक के लिए आप को परिभाषित करने की आवश्यकता होगी मुख्य द्वारा नहीं किया जाता है:

आप used विशेषता के साथ टैग करने, इस तरह से अप्रयुक्त प्रतीक पट्टी नहीं लिंकर बता सकते हैं निष्पादन योग्य लेकिन परीक्षण सूट द्वारा प्रयोग किया जाता है।

1

कुछ संभावनाओं:

  1. आप एक हैडर आयात और सही पुस्तकालय के खिलाफ लिंक न करें। यह आम है, विशेष रूप से क्वार्ट्जकोर जैसे पुस्तकालयों के लिए शीर्षकों के लिए, क्योंकि यह डिफ़ॉल्ट रूप से परियोजनाओं में शामिल नहीं है। हल करने के लिए:

    ए बिल्ड चरणों के पुस्तकालय अनुभाग के साथ लिंक बाइनरी में सही लाइब्रेरी जोड़ें।

  2. आप फ़ाइलों को अपनी परियोजना में कॉपी करते हैं लेकिन फ़ाइलों को जोड़ने के लिए लक्ष्य को जांचना भूल गए हैं। हल करने के लिए:

    ए सही लक्ष्य के लिए बिल्ड चरण खोलें, संकलन स्रोतों का विस्तार करें और अनुपलब्ध .m फ़ाइलों को जोड़ें।

  3. यदि आप तर्क परीक्षण का उपयोग कर रहे हैं, तो वे आईओएस उपकरणों पर समर्थित नहीं हैं, बल्कि केवल सिम्युलेटर में समर्थित हैं। आवेदन परीक्षण हालांकि उपकरणों पर काम करते हैं। उस के लिए दस्तावेज:

iOS: Xcode सिमुलेटर में तर्क और आवेदन इकाई परीक्षण चलाने कर सकते हैं, Xcode iOS उपकरणों पर तर्क इकाई परीक्षण नहीं चल सकता। इसलिए, यदि आप में दोनों प्रकार के यूनिट परीक्षणों को सक्रिय और सक्रिय करते हैं, तो आप आईओएस डिवाइस पर यूनिट परीक्षण चलाने के लिए उस योजना का उपयोग नहीं कर पाएंगे।

+0

पुन: 1 - इन प्रतीकों को मेरे उत्पादन कोड में घोषित और परिभाषित किया गया है, पुन: 2 -। एम फाइलें ऐप लक्ष्य का हिस्सा हैं, पुन: 3 - यूनिट परीक्षण " आवेदन परीक्षण "... वे सभी सही दिशा में निश्चित रूप से विचार हैं, धन्यवाद! – edelaney05

+0

आवेदन और तर्क परीक्षण यूनिट परीक्षणों के प्रकार हैं? क्या आप जानते हैं कि क्या आप तर्क या आवेदन परीक्षण का उपयोग कर रहे हैं? –

+0

आप इस सवाल में देख सकते हैं कि मैं विशेष रूप से बिल्ड सेटिंग के बंडल लोडर और टेस्ट होस्ट सेटिंग्स (http://developer.apple.com/library/ios/documentation/developertools/Conceptual/UnitTesting/02-Setting_Up_Unit_Tests_in_a_Project/setting_up को कॉल करता हूं। एचटीएमएल # // apple_ref/doc/यूआईडी/TP40002143-CH3-SW6)। इसके अलावा, प्रश्न में बाद में उल्लेख किया गया है कि मैं एक ब्रांड नई एक्सकोड परियोजना में पूरी तरह से अपना मुद्दा फिर से बना देता हूं; एप्लिकेशन परीक्षण किसी भी नई परियोजना में यूनिट परीक्षणों के लिए डिफ़ॉल्ट सेटअप हैं। – edelaney05

0

मुझे एक बार एक ही समस्या थी और समाधान परियोजना की सफाई के रूप में सरल था, मुझे लगता है कि आपने पहले से ही यह कोशिश की है, लेकिन शायद नहीं। मैं इसे कम से कम कोशिश करता हूं। शीर्ष नेविगेशन बार में बस "उत्पाद" -> "साफ करें" पर जाएं, या शॉर्टकट का उपयोग करें: "शिफ्ट" "कमांड" "के"

(मैंने इसे एक टिप्पणी के रूप में लिखा होगा और उत्तर नहीं दिया होगा, चूंकि यह एक आसान सुझाव नहीं है। लेकिन मेरे पास टिप्पणी करने के लिए पर्याप्त अंक नहीं हैं, क्षमा करें)।

+0

अरे। इच्छा है कि यह इतना आसान था। सलाह के लिये धन्यवाद! – edelaney05

+0

क्या आपने एक पूरी नई परियोजना शुरू करने की कोशिश की है और अपने पुराने प्रोजेक्ट से सभी कोड और डेटा को नए पर कॉपी कर दिया है? (एक तथाकथित पूर्ण पुनरारंभ)? – Sp3kk

+0

की तरह। मैंने अभी एक एकल प्रोजेक्ट और टेस्ट सूट के साथ एक नई परियोजना शुरू की है जो स्थैतिक वैश्विक चर से जुड़ा हुआ है। – edelaney05

12

यह सबसे अधिक संभावना है क्योंकि आपके पास अपने परीक्षण सूट द्वारा उपयोग किए जाने वाले प्रतीक हैं जो मुख्य अनुप्रयोग द्वारा उपयोग नहीं किए जाते हैं और मृत कोड स्ट्रिपिंग सक्षम है। आप प्रति कॉन्फ़िगरेशन आधार पर डेड कोड स्ट्रिपिंग विकल्प अक्षम कर सकते हैं। मैंने डीबग बिल्ड के लिए पर विकल्प को फ़्लिप करके अपने डिवाइस पर चलाने के लिए परीक्षण सक्षम करने के लिए एक समान समस्या तय की है।

+0

यह शायद बेहतर विकल्प है, क्योंकि यह सभी कोड के लिए काम करेगा, न केवल __attribute __ (जिसका उपयोग किया गया है)))। – aceontech

संबंधित मुद्दे