2009-11-30 7 views
17

मेरे पास एक सीपीपी स्रोत फ़ाइल है जो #if/#endif का उपयोग कुछ निश्चित रूप से पूरी तरह से संकलित करने के लिए करती है। हालांकि, यह निम्नलिखित चेतावनी उत्पन्न करता है।एमएस विजुअल सी ++ लिंकर चेतावनी को खत्म करने का सबसे अच्छा तरीका क्या है: "एलएनके 4221 चेतावनी"?

warning LNK4221: no public symbols found; archive member will be inaccessible 

मैं एक मैक्रो बनाने एक डमी चर या समारोह है कि वास्तव में ऐसा इस्तेमाल किया जा नहीं होगा इस त्रुटि दूर जाना होगा उत्पन्न करने के लिए के बारे में सोच रहा था लेकिन मुझे यकीन है कि यह इस तरह का उपयोग कर के रूप में समस्याओं का कारण नहीं है बनाना चाहते कई फाइलों में मैक्रो लिंकर को गुणा परिभाषित प्रतीकों पर बम करने का कारण बनता है।

इस चेतावनी से छुटकारा पाने के लिए सबसे अच्छा तरीका क्या है (लिंकर कमांड लाइन पर चेतावनी को दबाए बिना)?

एफडब्ल्यूआईडब्लू, मुझे यह जानने में दिलचस्पी होगी कि लिंकर कमांड लाइन पर चेतावनी दबाने के साथ इसे कैसे करना है, लेकिन मेरे सभी प्रयासों को लिंकर द्वारा आसानी से अनदेखा किया जाता है और अभी भी त्रुटि उत्पन्न होती है।

एक अन्य आवश्यकता: फिक्स व्यक्तिगत फ़ाइल बिल्ड या एकता निर्माण (सीपीपी फाइल बिल्ड को गठबंधन) तक खड़े होने में सक्षम होना चाहिए क्योंकि हमारी बिल्ड कॉन्फ़िगरेशन में से एक एक बड़ा निर्माण है (एकता निर्माण की तरह लेकिन थोक फाइलों के समूह एक मास्टर एकता फ़ाइल की तुलना में)।

+0

लिंकर को कॉल करने के लिए क्या वाक्यविन्यास आपने कोशिश की है (और यह आपके लिए काम नहीं करता है)? –

+0

मैंने सीपीपी फ़ाइल के लिए लिंकर के लिए "/ अनदेखा: 4221" और "#pragma चेतावनी (अक्षम: 4221)" की कोशिश की है। न तो काम किया। – Adisak

+0

एक तरफ के रूप में - 'एकता निर्माण' का उद्देश्य क्या है? –

उत्तर

12

ठीक है, मैं जिस फिक्स का उपयोग करने जा रहा हूं वह मामूली चिमटा के साथ पावेल का सुझाव है। कारण मैं इसे ठीक उपयोग कर रहा हूँ यह एक आसान मैक्रो में ड्रॉप करने और उस में काम करता रहेगा है थोक बनाता है/एकता-बनाता है साथ ही सामान्य रूप में बनाता है:

साझा हैडर:

// The following macro "NoEmptyFile()" can be put into a file 
// in order suppress the MS Visual C++ Linker warning 4221 
// 
// warning LNK4221: no public symbols found; archive member will be inaccessible 
// 
// This warning occurs on PC and XBOX when a file compiles out completely 
// has no externally visible symbols which may be dependant on configuration 
// #defines and options. 

#define NoEmptyFile() namespace { char NoEmptyFileDummy##__LINE__; } 

फ़ाइल है कि पूरी तरह से बाहर संकलन हो सकता है:

NoEmptyFile() 
#if DEBUG_OPTION 
     // code 
#endif // DEBUG_OPTION 
20

एक गुमनाम नाम स्थान का उपयोग करें:

namespace { char dummy; }; 

इस तरह के नाम स्थान के भीतर प्रतीकों बाहरी संबंध है, इसलिए वहाँ निर्यात तालिका में कुछ हो जाएगा। दूसरी ओर, प्रत्येक अनुवाद इकाई के लिए नामस्थान नाम स्वयं अलग होगा (आप इसके बारे में "यादृच्छिक रूप से जेनरेट" के रूप में सोच सकते हैं), इसलिए कोई संघर्ष नहीं।

+1

मैं इसका परीक्षण करने जा रहा हूं। मुझे इसे एकता के निर्माण के साथ काम करने की ज़रूरत है, इसलिए मुझे इसे "चार डमी ## __ LINE__;" के साथ मैक्रो बनाना पड़ सकता है। या ऐसा कुछ है इसलिए मेरे पास एक एकल अनुवाद इकाई के भीतर दोहराए गए प्रतीक नहीं हैं। – Adisak

+0

ठीक है मुझे नहीं लगता कि आपको प्रति इकाई एक से अधिक की आवश्यकता होगी। – GManNickG

+0

यहां हमारे एकता पर बम को ठीक किया गया है, लेकिन इसे वर्णित मामूली मॉड के साथ काम करना चाहिए। – Adisak

1

(हालांकि चर्चा पहले से ही पुराना है और मैं सीधे @ Adisak के जवाब टिप्पणी नहीं कर सकता), मुझे लगता है यह काम करने के लिए के लिए कुछ अतिरिक्त मैक्रो विस्तार जादू की जरूरत है:

#define TOKENPASTE(x, y) x ## y 
#define TOKENPASTE2(x, y) TOKENPASTE(x, y) 
#define NONEMPTY_TRANSLATION_UNIT char TOKENPASTE2(NoEmptyFileDummy, __LINE__);