2012-10-11 27 views
22

मैं ओएस एक्स 10.8 पर एक्सकोड 4.5.1 का उपयोग करके नमूना कोड "सोनोफ्रैब" संकलित करने का प्रयास कर रहा हूं।इनलाइन फ़ंक्शंस के लिए त्रुटि लिंकिंग

एक समारोह controller.m में इस तरह परिभाषित किया गया है

inline uint32_t ChangeBits(uint32_t currentBits, uint32_t flagsToChange, BOOL setFlags); 

यह इस त्रुटि संदेश की ओर जाता है:

Undefined symbols for architecture x86_64: 
"_ChangeBits", referenced from: 
-[Controller awakeFromNib] in Controller.o 
[...] 
ld: symbol(s) not found for architecture x86_64 

समारोह ChangeBits को इनलाइन निकाला जा रहा है समस्या का हल, लेकिन क्यों करता है लिंकर को मूल परिभाषा के साथ चेंजबिट नहीं मिला?

उत्तर

40

यह मेरे लिए, एक बग की तरह दिखता है।

inline void foo() {} 
int main() { 
    foo(); 
} 

पैदावार: यह सरल मामले में एक ही त्रुटि दर्शाती

$ clang test-inline.c 
Undefined symbols for architecture x86_64: 
    "_foo", referenced from: 
     _main in test-inline-MfUY0X.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

मिला है यह गलत होने के लिए !? जब तक मैं पूरी तरह से inline के बारे में कुछ याद नहीं कर रहा हूं।

संपादित करें: अरे नहीं, प्रतीक्षा इस की जाँच - http://clang.llvm.org/compatibility.html#inline

मूल रूप से यह प्रतीत होता है कि मैं पूरी तरह से inline समझ में नहीं आया, या तो। और न ही उस व्यक्ति ने ऐप्पल में नमूना कोड लिखा था!

inlineChangeBits फ़ंक्शन पर इसका अर्थ है कि परिभाषा केवल इनलाइनिंग के लिए उपयोग की जानी चाहिए। यह नहीं कि समारोह हमेशा रेखांकित किया जाना चाहिए। आवेदन में कहीं और उपलब्ध अन्य, गैर-इनलाइन परिभाषा होनी चाहिए अन्यथा यह अवैध है। इसलिए लिंक त्रुटि कोई गैर-इनलाइन ChangeBits प्रदान नहीं की जाती है।

असली समाधान ChangeBits को static inline के रूप में घोषित करना है क्योंकि यह संकलक को बताता है कि परिभाषा केवल उस अनुवाद इकाई के लिए स्थानीय है और इसलिए गैर-इनलाइन परिभाषा होने की आवश्यकता नहीं है।

एलएलवीएम पेज पर अधिक जानकारी जो मैंने लिंक की है, हालांकि। उम्मीद है की वो मदद करदे!

+1

मुझे ओएस एक्स 10.7 पर एक ही कोड नमूना के साथ यह समस्या याद नहीं है। क्या इस कोड को तोड़ने वाले झुकाव पर कुछ बदलाव हुए हैं? – alecail

+0

शायद क्योंकि आप पहले जीसीसी या एलएलवीएम-जीसीसी का उपयोग कर रहे थे। एलएलवीएम-जीसीसी जीसीसी के साथ संगत होने के लिए है, यानी एक ही परिणाम उत्पन्न करते हैं। अब आप क्लैंग का पूरी तरह से उपयोग कर रहे हैं, आप एलएलवीएम दस्तावेज़ों में वर्णित सटीक चीज़ के अनुसार त्रुटि को देख रहे हैं। – mattjgalloway

+3

मैं इस समस्या में भाग गया और mattjgalloway के जवाब इसे हल किया। बस अधिक स्पष्ट होने के लिए, Controller.m में, पंक्ति 71, "इनलाइन" के सामने "स्थिर" जोड़ें। –