2013-02-20 28 views
17

में संक्रमण के दौरान बाहरी पुस्तकालयों (उदा। बूस्ट) का प्रबंधन करना मैं अपनी वर्तमान परियोजना को सी ++ 11 में ले जाना चाहता हूं। कोड सभी clang ++ -std = C++ 0x का उपयोग करके संकलित करता है। यह आसान हिस्सा है :-)। मुश्किल हिस्सा बाहरी पुस्तकालयों से निपट रहा है। कोई बाहरी पुस्तकालयों के साथ किसी की सी ++ 11 ऑब्जेक्ट्स को जोड़ने पर भरोसा नहीं कर सकता है जिसे सी ++ 11 के साथ संकलित नहीं किया गया था (http://gcc.gnu.org/wiki/Cxx11AbiCompatibility देखें)। बूस्ट, उदाहरण के लिए, निश्चित रूप से फिर से निर्माण की आवश्यकता है (Why can't clang with libc++ in c++0x mode link this boost::program_options example?)। मेरे पास उपयोग की जाने वाली सभी बाहरी पुस्तकालयों का स्रोत है, इसलिए मैं (कुछ दर्द के साथ) सैद्धांतिक रूप से इन libs को C++ 11 के साथ फिर से बना सकता हूं। हालांकि, कि अब भी मुझे कुछ समस्याओं के साथ छोड़ देता है:सी ++ 11

एक मिश्रित सी ++ 03/सी ++ 11 वातावरण में विकास: मैं सी ++ 03 है कि कभी कभी रखरखाव की आवश्यकता होती का उपयोग कर कुछ पुराने प्रोजेक्ट नहीं है। बेशक, मैं इन्हें बाहरी पुस्तकालयों के मौजूदा संस्करणों से जोड़ना चाहता हूं। लेकिन मेरी वर्तमान (और नई) परियोजनाओं के लिए, मैं पुस्तकालयों के अपने पुन: निर्मित सी ++ 11 संस्करणों से लिंक करना चाहता हूं। मैं इसका सामना करने के लिए अपने विकास वातावरण (वर्तमान में उबंटू 12.04 और मैक ओएस एक्स 10.7) कैसे व्यवस्थित करूं?

मुझे लगता है कि इस समस्या का सामना कई डेवलपर्स द्वारा किया जाएगा। यह दूर नहीं जा रहा है, लेकिन मुझे एक अनुशंसित और आम तौर पर अनुमोदित समाधान नहीं मिला है।

परिनियोजन: वर्तमान में, मैं क्लाउड में उबंटू 12.04 एलटीएस सर्वर पर तैनात हूं। अनुभव लिनक्स वितरण के साथ मानक पैकेज (उदा। Libboost) पर निर्भर (जहां संभव हो) पर निर्भर करता है। अगर मैं अपनी वर्तमान प्रोजेक्ट को सी ++ 11 पर ले जाता हूं, तो मेरी समझ यह है कि मुझे बाहरी पुस्तकालयों के अपने संस्करणों का निर्माण करना होगा। मेरा अनुमान है कि किसी बिंदु पर यह बदल जाएगा, और उनकी इच्छा सी ++ 11 संगतता वाले लाइब्रेरी पैकेज के 'मानक' संस्करण होंगे। क्या किसी को कोई विचार है जब कोई ऐसा होने की उम्मीद कर सकता है? और संभवतः इसके ऊपर उल्लिखित समस्या के मानक समाधान की आवश्यकता होगी - एक ही मंच पर सी ++ 03 libs और C++ 11 libs के समवर्ती अस्तित्व।

मुझे आशा है कि मुझे कुछ बुनियादी याद आ गया है ताकि इन समस्याओं को उचित जानकारी के एक पफ में गायब हो जाए! क्या मैं जल्द ही सी ++ 11 में जाने की कोशिश कर रहा हूं?

अद्यतन (2013-09-11): macports के लिए संबंधित चर्चा: https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html

+3

"मैं अपने विकास वातावरण को कैसे व्यवस्थित कर सकता हूं ... इसका सामना करने के लिए?" - विभिन्न पुस्तकालय पथों को पारित करने के लिए अपने निर्माण तंत्र को समायोजित करें; क्लैंग और जीसीसी के लिए, '-एल' आपका मित्र है। – Xeo

+0

@ ज़ीओ, मैं -एल से परिचित हूं। मुझे समझ में नहीं आता कि क्लैंग के पास जीसीसी के लिए एक अलग पुस्तकालय पथ क्यों समस्या हल करता है। शायद आप विस्तृत कर सकते हैं? यदि मुझे अलग-अलग निर्देशिकाओं में 'मानक' बाहरी पुस्तकालयों के विभिन्न निर्माणों (शायद सी ++ 11 के लिए एक, सी ++ 03 के लिए एक, और दोनों के साथ काम करने वाले libs के लिए) के निर्माण के लिए अपनी खुद की प्रक्रिया बनाने की आवश्यकता है, तो मैं मैं ऐसे स्थान पर हूं जहां मैं इससे बचूंगा, और एक ऐसा जो कि मैं उसी चक्र के आविष्कार (छोटे बदलाव) के ज़िलियंस के साथ साझा कर रहा हूं। क्या यह कैसे होगा? –

+0

तो ...आप क्लैंग के साथ संकलन करते हैं लेकिन जीसीसी एबीआई दस्तावेज का उपयोग करते हैं? :) –

उत्तर

1

आप "ठीक से" अपने लक्ष्य तैनाती के लिए अपने निर्माण कॉन्फ़िगर करने के लिए अपने कॉन्फ़िगर toolchain (जैसे autotools) का उपयोग करना चाहिए। आपके कॉन्फ़िगरेशन परीक्षणों को एबीआई संगत सी ++ 11 बाइनरी की जांच करनी चाहिए और पता लगाने पर लिंकर को पहले उनका उपयोग करने का निर्देश देना चाहिए। यदि नहीं, वैकल्पिक रूप से एक C++ 03 निर्माण में विफल या फ़ॉलबैक।

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

यह गन्दा लग सकता है, लेकिन इन गड़बड़ी को संभालने के लिए टूलचेन्स को कॉन्फ़िगर किया गया था।

+0

ये आवाज नौकरी के लिए सही उपकरण की तरह है। एक "एबीआई संगत सी ++ 11 बाइनरी की जांच कैसे करता है?"। एक ही डीआईआर में बाहरी libs के विभिन्न संस्करणों (सी ++ 03, सी ++ 11) संस्करणों के साथ, क्या कोई भी एबीआई संगतता दोनों की जांच कर सकता है? या किसी को, उदाहरण के लिए, -l लिंकर विकल्प से मेल खाने वाले प्रतीकात्मक लिंक सेट अप करने की आवश्यकता है? –

+0

हाँ, यह गन्दा लगता है! वर्तमान में प्रयास करने के लिए मेरे लिए बहुत गड़बड़ है (मुझे हमेशा ऑटोकॉन्फ़ डरावना लगता है!) जब तक कि मैं किसी और को कॉपी नहीं कर सकता जो उपकरण से अधिक परिचित है। –