2012-05-23 9 views
18

मुझे पता है कि सिद्धांत रूप में यह शायद अपरिभाषित व्यवहार है, लेकिन एक बड़ी परियोजना के साथ काम कर के हित में है, यहाँ जीसीसी के बारे में मेरे सवाल है:क्या अलग-अलग जीसीसी बोलीयां एक साथ जुड़ी हो सकती हैं?

मान लीजिए मैं gcc -std=c++98 के साथ एक लेन-देन इकाई, और एक अन्य संकलन -std=c++11 साथ, का उपयोग करते हुए सटीक एक ही संकलक स्थापना। क्या कोई गारंटी है कि मैं दो ऑब्जेक्ट फाइलों को जोड़ सकता हूं और एक अच्छी तरह से परिभाषित प्रोग्राम प्राप्त कर सकता हूं?

जहां तक ​​मेरा बता सकते हैं, संभावित समस्याओं केवल भिन्न मैक्रो के कारण पुस्तकालय हेडर के विभिन्न दृश्यों से आ सकता है, और बदले में उन पर सबसे अच्छा को, नए सदस्य काम करता है, लेकिन कभी भी सदस्य वस्तुओं जोड़ना होगा मानक पुस्तकालय कक्षाएं।

इस किसी भी तरह यह स्वीकार्य अलग भाषा बोली विकल्पों के साथ एक बड़ी परियोजना के विभिन्न भागों संकलित करने के लिए होगा?

अद्यतन: मैं एक ओर्थोगोनल प्रश्न जोड़ना चाहिए: क्या (जैसे कि 4.3 और 4.6) जीसीसी के दो अलग संस्करणों, लेकिन उपयोग करने के बारे wht ही बोली विकल्प (-std=c++98)? लिस्टिंग in this GCC documentation यह सुझाव देती है कि पुस्तकालय 4.2.2 और 4.6 के बीच दोनों दिशाओं में संगत है।

उत्तर

10

एक प्राथमिकता, नहीं। सबसे सुरक्षित समाधान यह मानना ​​है कि संकलक विकल्पों के सभी समान हैं, सिवाय इसके कि जब संकलक विशेष रूप से दस्तावेज करता है कि विकल्प बाइनरी संगतता को प्रभावित नहीं करता है। (प्रलेखन जो अत्यंत कष्ट सबसे compilers में कमी है।) अभ्यास में, प्रलेखन के अभाव में, यह एक सुरक्षित शर्त है कि विकल्प है जो चेतावनी (छ ++ में -W...) को नियंत्रित दोहरी संगतता को प्रभावित नहीं करेगा लगता है, और है कि विकल्प है जो कोड पीढ़ी को प्रभावित (भाषा स्तर, इत्यादि): जी ++ आमतौर पर अनुकूलन के विभिन्न स्तरों पर संगतता बनाए रखता है, जहां वीसी ++ नहीं होता है।

एक और वास्तविक समस्या कमांड लाइन में पूर्वप्रक्रमक प्रतीकों को परिभाषित किया गया है। दोबारा, सबसे सुरक्षित शर्त यह है कि सभी परिभाषाएं समान होती हैं, लेकिन फिर भी, कुछ सामान्य समझ क्रम में होती है: कोई भी मानक पुस्तकालय को प्रीप्रोसेसर प्रतीकों के साथ संकलित करने की अपेक्षा नहीं कर सकता है जो आपके प्रोजेक्ट में उपयोग किए जाते हैं (MYPROG_CONFIG_FILE_LOCATION जैसी चीजें, कहते हैं)। दूसरी तरफ, ध्यान रखें कि _GLIBCXX_DEBUG और _GLIBCXX_DEBUG_PEDANTIC की प्रीप्रोसेसर परिभाषा बाइनरी संगतता को प्रभावित करेगी (हालांकि जी ++ यह सुनिश्चित करता है कि आपको लाइब्रेरी संस्करण मिलेगा जो उनके साथ काम करता है यदि आप लगातार उनका उपयोग करते हैं)।

के साथ अपने प्रश्न का संबंध है

: अगर चुनाव एक तरीका है कि टूट जाएगा, कुछ पूर्व निर्धारित पूर्वप्रक्रमक प्रतीकों को प्रभावित करता है मैं मानक संस्करण, लेकिन यह शायद ही मुझे आश्चर्य होता है की वजह से दोहरी संगतता पर ज्यादा प्रभाव की उम्मीद नहीं होता लाइब्रेरी में बाइनरी संगतता, जैसे कि आप _GLIBCXX_DEBUG के साथ कुछ मॉड्यूल संकलित करेंगे, और कुछ बिना। यह काम कर सकता है, लेकिन मैं उस पर भरोसा नहीं करता।

+1

"एक शायद ही उम्मीद कर सकते हैं मानक पुस्तकालय पूर्वप्रक्रमक प्रतीक हैं, जो अपनी परियोजना में उपयोग किया जाता है के साथ संकलित की गई" - और भले ही वह था, और एक पल है कि मैक्रो के लिए लगता है 'MYPROG_CONFIG_FILE_LOCATION' का उपयोग 'memset.c' में किया जाता है, फिर उस शब्द का अर्थ' memset.c' को परिभाषित करता है जो आपके प्रोग्राम में इसके अर्थ से पूरी तरह से असंबंधित है। इसलिए यदि 'MYPROG_CONFIG_FILE_LOCATION' के साथ/बिना' memset.c' को संकलित करना बाइनरी संगतता में एक अंतर बनाता है, तो यह आपके प्रोग्राम को 'MYPROG_CONFIG_FILE_LOCATION' का उपयोग करने के लिए भी स्वतंत्र रूप से ऐसा करेगा। –

+0

@SteveJessop हां। यहां तक ​​कि अगर यह था, यह आपके लिए पारदर्शी होना चाहिए। व्यावहारिक रूप से, आपके नामस्थान में सभी प्रीप्रोसेसर प्रतीकों (यानी अंडरस्कोर से शुरू नहीं होते हैं, और दो आसन्न अंडरस्कोर नहीं होते हैं) _should_ सुरक्षित रहें। कार्यान्वयन नामस्थान में प्रीप्रोसेसर प्रतीक, जैसे '_GLIBCXX_DEBUG', नहीं होंगे। –

3

मुझे पता है कि सिद्धांत रूप में यह शायद अपरिभाषित व्यवहार है,

यह नहीं है।

मान लीजिए मैं -std=c++11 साथ gcc -std=c++98 के साथ एक लेन-देन इकाई, और एक अन्य संकलन, ठीक उसी संकलक स्थापना का उपयोग। क्या कोई गारंटी है कि मैं दो ऑब्जेक्ट फाइलों को जोड़ सकता हूं और एक अच्छी तरह से परिभाषित प्रोग्राम प्राप्त कर सकता हूं?

हाँ, यह समर्थित और है काम करता है (अपवाद अन्य एक वस्तु में डिबग मोड सक्षम करने और नहीं, या कि उसका -fshort-enums और अन्य नहीं की तरह स्पष्ट रूप-ABI बदलते विकल्पों का उपयोग कर की तरह, देखते हैं, लेकिन यह चाहिए स्पष्ट रहें क्योंकि यह काम नहीं करेगा भले ही आप दोनों ऑब्जेक्ट्स के लिए -std विकल्प का उपयोग करें)।

जहां तक ​​मेरा बता सकते हैं, संभावित समस्याओं केवल भिन्न मैक्रो के कारण पुस्तकालय हेडर के विभिन्न दृश्यों से आ सकता है, और बदले में उन पर सबसे अच्छा करने के लिए नए सदस्य काम करता है, लेकिन कभी भी सदस्य वस्तुओं जोड़ना होगा, मानक पुस्तकालय कक्षाएं।

दाएं।

क्या यह किसी भी तरह से विभिन्न भाषा बोली विकल्पों के साथ एक बड़ी परियोजना के विभिन्न हिस्सों को संकलित करने के लिए स्वीकार्य होगा?

जीसीसी के लिए, हाँ, बिल्कुल। सबूत के रूप में यह ठीक है, मान लें कि libstdc++.so में -std=c++98 के साथ निर्मित कुछ ऑब्जेक्ट्स हैं और कुछ -std=c++14 के साथ बनाए गए हैं।

अद्यतन: मैं एक ओर्थोगोनल प्रश्न जोड़ना चाहिए: जीसीसी के दो विभिन्न संस्करणों (जैसे कि 4.3 और 4.6) का उपयोग कर के बारे में क्या है, लेकिन एक ही wht बोली विकल्प (-std = C++ 98)? इस जीसीसी दस्तावेज में लिस्टिंग का सुझाव है कि पुस्तकालय 4.2.2 और 4.6 के बीच दोनों दिशाओं में संगत है।

नहीं दोनों दिशाओं में, आप जीसीसी 4.6 (या नवीनतम) से libstdc++.so उपयोग करने के लिए है, क्योंकि उद्देश्य यह है कि संस्करण के साथ संकलित प्रतीकों कि नए संस्करण में पेश किए गए और में मौजूद नहीं हैं पर निर्भर कर सकते की आवश्यकता होगी पुराना libstdc++.so पुस्तकालय।

https://stackoverflow.com/a/49119902/981959

0

भाषा ABI में कुछ संबंधित जानकारी ही है, लेकिन एसटीएल ABI अलग है। https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

तो -std = C++ 98 -std = C++ 11 के साथ संकलित मिश्रित पुस्तकालयों की अनुशंसा न करें। छवि सीमाओं में डेटा पारित करते समय आपको क्रैश हो सकता है।

(यह काम कर सकता है अगर आप केवल बाहरी "सी" कार्यों को कॉल करते हैं और केवल पीओडी पास करते हैं)।

साथ ही इससे संबंधित देखें: Mixing different C++ standards with GCC

+0

वह विकी पेज अद्यतित नहीं है :-( –

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