क्या मुझे उन्हें जोड़ने के बजाय पुस्तकालयों के स्रोत को जोड़ना चाहिए?


14

मैं C ++ के लिए अपेक्षाकृत नया हूं, इसलिए मुझे यकीन नहीं है कि मुझे छोटी निर्भरता (जैसे एक स्क्रिप्टिंग भाषा, या JSON / YAML / XML पार्सर) को सबसे अच्छी तरह से कैसे संभालना चाहिए।

क्या मुझे अलग-अलग प्रोजेक्ट बनाने चाहिए और उन्हें स्टैटिक लाइब्रेरी के रूप में लिंक करना चाहिए, या क्या केवल .h / .cpp फाइलों को अपने मुख्य प्रोजेक्ट में डालने की डाउनसाइड हैं?

उत्तरार्द्ध बहुत आसान लगता है क्योंकि मैंने कई घंटे असंगत पुस्तकालयों (पुस्तकालय के निर्माण के समय अलग-अलग संकलक सेटिंग) से निपटने में बिताए हैं, लेकिन मैं गलत तरीके से C ++ सीखना शुरू नहीं करना चाहता।

यदि उन्हें अलग-अलग पुस्तकालयों के रूप में रखना बेहतर होता है, तो मैं सबसे अच्छा संकलन के झंडे को सिंक में कैसे रखूंगा ताकि .lib / .a फाइलें सफलतापूर्वक मेरे आवेदन से जुड़ी हों?

(मैं वर्तमान में MSVC 2015 के साथ काम कर रहा हूं, लेकिन लक्ष्य मैक ओएस एक्स और आईओएस पर XCode / clang का उपयोग करके संकलन करना है, ताकि मुझे कम से कम 3 अलग-अलग प्रकार के पुस्तकालयों से निपटना पड़े (Win x86, Mac x64, ARM) )


5
ABIss में टकटकी लगाइए और वे आपको देखेंगे
बासीलेव्स

1
ध्यान रखें कि कुछ पुस्तकालयों का उपयोग इस तरह से करने का इरादा है। SQLite पुस्तकालय के पसंदीदा उपयोग पैटर्न निष्पादन में संकलित करने के लिए एक सी या सी ++ आवेदन के स्रोत पेड़ में समामेलित स्रोत और हेडर फाइल ड्रॉप करने के लिए है।
मार्क बेनिंगफील्ड

जवाबों:


6

TLDR;

क्या आपको स्रोत जोड़ना चाहिए ? हाँ X को स्रोत जोड़ना
चाहिए ? DEPENDS

यहाँ क्यों आता है ...

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

एक और महत्वपूर्ण संस्करण है। क्या आपको वास्तव में प्रत्येक पुस्तकालय को अलग से संस्करण की आवश्यकता है? हर एक के खिलाफ परीक्षण चलाएं? कई टीम के सदस्यों के बीच इसे वितरित करें? यदि आप करते हैं, तो पुस्तकालय महान हैं, और घूमने के लिए सुविधाजनक है, लेकिन फिर से, लगता है कि आप इस बारे में परवाह नहीं करते हैं।

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

मैं यह सब अनुभव से जानता हूं:

स्विफ्ट परियोजनाओं के लिए, मैं निश्चित रूप से फ्रेमवर्क (पुस्तकालयों) का उपयोग करता हूं और उनके खिलाफ लिंक करता हूं, क्योंकि एक्सकोड का उपयोग करना कॉन्फ़िगर करना आसान है। मुझे भी वास्तव में वहाँ के संस्करण, परीक्षण और डीकोपिंग की आवश्यकता है, इसलिए ऐसा है।

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

अंत में, आपके लिए सबसे अधिक प्रासंगिक, एक C ++ गेम प्रोजेक्ट, जिस पर मैंने काम किया। एक गेम इंजन, नेटवर्क रीयलटाइम क्लाइंट, नेटवर्क HTTP क्लाइंट, एआई और एक दृढ़ता स्टोर इस गेम के लिए लिखा गया था, बस क्लाइंट साइड पर। मैंने क्या चुना? क्लेयन + लाइब्रेरीज़। भले ही मैं पुस्तकालयों का उपयोग कर रहा था, लेकिन ऐसा महसूस नहीं हुआ कि मैं था। सभी स्रोत CLion IDE प्रोजेक्ट में थे, और CMakeLists की रचना करके, मैं सभी बिल्ड को ट्रिगर करने और उन्हें एक ही स्ट्रोक में लिंक करने में सक्षम था।

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

पुनश्च: मैं इन दिनों docker के साथ एक समान दुविधा में हूं। क्या मुझे रचना करनी चाहिए? क्या मुझे स्थानीय स्तर पर बस चलाना चाहिए? .. आदि भी अमृत, क्योंकि यह आपको एक ही आवेदन के भीतर अनुप्रयोगों का निर्माण करने की अनुमति देता है .. क्या मुझे ऐसा करना चाहिए? या एप्लिकेशन को तथाकथित सूक्ष्म सेवाओं में अलग करें? ... आदि कोई चांदी की गोली नहीं है, हमेशा खुद को मापें, जैसा कि वाईएमएमवी।


2

C ++ पुस्तकालयों के साथ जोड़ने के लिए बहुत परेशानी की आवश्यकता होती है, और इसे सही ढंग से करने के लिए बहुत सारे ज्ञान और प्रयास की आवश्यकता होती है। यह C ++ शिक्षार्थियों को डरा सकता है।


अक्सर बार, एक विशिष्ट सी ++ लाइब्रेरी के लेखकों / अनुरक्षकों को यह ध्यान में रखना होगा, और एक या दूसरे तरीके की सिफारिश करेगा।

दूसरे शब्दों में, यदि लेखक / अनुचर पुस्तकालय को हेडर (* .h और .hpp) द्वारा शामिल करने का इरादा रखते हैं , या स्रोत ( .h *, या .c ) द्वारा शामिल करते हैं, तो यह रीडमी में स्पष्ट रूप से कहा होगा। या प्रलेखन।


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


लेखकों / अनुरक्षकों की सिफारिश के खिलाफ जाना संभव है, लेकिन इसके लिए हमेशा एक व्यापक पोर्टिंग प्रयास की आवश्यकता होती है। उस पोर्टिंग प्रयास के लिए आवश्यक कार्य की मात्रा एक भिन्न C ++ वातावरण में पोर्ट करने के लिए तुलनीय हो सकती है।


क्योंकि Visual C ++ प्रोजेक्ट डिस्क्रिप्शन फ़ाइल (आंशिक रूप से XML- आधारित) के आधार पर अपने स्वयं के बिल्ड सिस्टम का उपयोग करता है, यह लिनक्स के तहत उपयोग किए जाने वाले स्क्रिप्टिंग-आधारित बिल्ड सिस्टम के बिल्कुल विपरीत है। CMake द्वारा उपयोग किया जाने वाला दृष्टिकोण कॉन्फ़िगरेशन सेटिंग्स लेने के लिए CMake के लिए है, और फिर पूरे दृश्य C ++ प्रोजेक्ट संरचना का उत्सर्जन करता है, कॉन्फ़िगरेशन विकल्पों में * .vcxproj फ़ाइलों में बेक किया गया है।

यदि विजुअल C ++ के साथ C ++ लिंक करने के दौरान समस्याएँ उत्पन्न होती हैं, तो * .vcxproj फ़ाइलों में बिल्ड सेटिंग्स Visual Studio GUI (प्रोजेक्ट प्रोजेक्ट पेज डायलॉग का उपयोग करके) को संशोधित किया जा सकता है। यह मानता है कि आप एक दर्जन से अधिक महत्वपूर्ण C ++ संकलन और लिंकिंग के अर्थ और परिणामों को अच्छी तरह से समझते हैं।

अब विजुअल C ++ का उपयोग करने का सबसे बड़ा हिस्सा आता है: यदि आप एक दर्जन अलग-अलग थर्ड-पार्टी लाइब्रेरी का उपयोग कर रहे हैं, तो उन सभी के लिए बिल्ड सेटिंग्स बदलने का मतलब है कि प्रत्येक * .vcxproj फ़ाइल में जाना, और एक दर्जन के लिए GUI पर समान परिवर्तन को दोहराएं। बार। एक परेशानी, लेकिन यह किया जा सकता है, यदि आप जानते हैं कि इसे सही तरीके से कैसे किया जाए।

अधिकांश विज़ुअल C ++ शिक्षार्थी इन सेटिंग्स को कठिन तरीके से सीखते हैं, विजुअल C ++ कंपाइलर और लिंकर त्रुटियों को देखकर, उनके त्रुटि कोड द्वारा पहचाना जाता है। उदाहरण के लिए, कोई भी LNK2005 को देख सकता है, "प्रतीक चिन्ह को एक से अधिक बार परिभाषित किया गया था" के सतही अर्थ के साथ, लेकिन इस समझ के साथ कि डुप्लिकेट परिभाषा एक लापरवाह प्रोग्रामिंग गलती से उत्पन्न नहीं होती है, इसके बजाय ऐसा कुछ के कारण हो सकता है। संकलन और लिंकिंग विकल्पों के टकराव या गलतफहमी।


अपनी स्थिति के लिए अधिक विशिष्ट और उपयोगी उत्तर प्रदान करने के लिए, आपको उन पुस्तकालयों के नामों को जानना होगा, जिनका आप उपयोग करना चाहते हैं, साथ ही साथ लिंक करने वाली त्रुटियां या अन्य कठिनाइयाँ जो आपको आती हैं। आप संबंधित लाइब्रेरी के चर्चा बोर्डों में उन सवालों के मौजूदा जवाब पा सकते हैं। ये प्रश्न "लिंकिंग मुद्दों", "विंडोज़", और "विज़ुअल सी ++" के साथ टैग किए जाते हैं।

इस मुद्दे पर एक शुरुआती-से-विशेषज्ञ गाइड संभव है, लेकिन यह परियोजना-विशिष्ट होने जा रहा है। अलग-अलग परियोजनाओं द्वारा चुनी गई अलग-अलग प्राथमिकताओं के लिए गाइड के पूर्ण पुनर्लेखन की आवश्यकता होगी।


यदि आप .vcxproj को उत्सर्जित करने के लिए CMake का उपयोग करते हैं, तो -vcxproj को संशोधित करने के बजाय आप CMake कॉन्फिगर को संशोधित कर सकते हैं
Caleth

1

मैं कहूंगा हां, जब तक यह आसान है। काफी लाभ हैं:

  1. इसका परिणाम तेजी से और बेहतर कोड में होगा, खासकर यदि आप लिंक टाइम ऑप्टिमाइज़ेशन को चालू करते हैं।

  2. आपका IDE इसे और अधिक पसंद करेगा, उदाहरण के लिए, यह (उम्मीद है) आपको लाइब्रेरी कोड के कार्यान्वयन (.cpp) पर जाने की अनुमति देगा , बजाय केवल इंटरफ़ेस (.h) के, जो बुरी तरह से प्रलेखित कोड (यानी) के साथ काम करते समय बेहद उपयोगी है। अधिकांश कोड)।

  3. यह अक्सर आपको गिट सबमॉड्यूल के रूप में निर्भरता को जोड़ने की अनुमति देता है, जो कि थोड़ा हैकरी है लेकिन वास्तव में निर्भरता के लिए बहुत अच्छा तरीका है (वैसे भी सी + +, जिसमें बहुत ज्यादा कोई बिल्ड सिस्टम नहीं है)। यह लाइब्रेरी को अपडेट करना और विभिन्न संस्करणों का परीक्षण करना वास्तव में आसान बनाता है।

  4. आपको MSVC ++ 2013 के साथ संकलित होने की निर्भरता के बारे में चिंता करने की ज़रूरत नहीं है, जबकि आप उदाहरण के लिए 2017 का उपयोग कर रहे हैं। या स्थिर MSVCRT बनाम साझा किया गया।

  5. आप आसानी से डिबग मोड में निर्माण कर सकते हैं और लाइब्रेरी में कदम रख सकते हैं।

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

एक उदाहरण के रूप में, मैं कुछ परियोजनाओं में लिबास का उपयोग करता हूं, और मुझे विंडोज का समर्थन करने की आवश्यकता है। libusb ऑटोटूल का उपयोग करता है जो एक बिल्ड सिस्टम का मजाक है और वास्तव में वैसे भी विंडोज पर काम नहीं करता है। वे पूर्व-निर्मित बायनेरिज़ प्रदान करते हैं, लेकिन वे MSVC ++ 2013 के साथ बनाए गए हैं और 2017 के साथ काम नहीं करेंगे। अब तक का सबसे आसान समाधान मेरी परियोजना के लिए सभी प्रासंगिक .c और .h फ़ाइलों को जोड़ना था।


2
1) सच में? एक स्थिर लाइब्रेरी सिर्फ ऑब्जेक्ट फ़ाइलों का एक संग्रह है, जैसे कि यदि आपने उन्हें संकलित किया था।
Baldrickk

आप उन .oफ़ाइलों का एक संग्रह बना सकते हैं -flto, जिनके साथ संकलित किया गया है, लेकिन वे वास्तव में एक स्थिर पुस्तकालय नहीं हैं - क्लैंग के लिए वे LLVM बिटकोड फाइलें हैं। और यह स्पष्ट रूप से काम नहीं करेगा यदि आप स्थिर पुस्तकालयों का उपयोग करते हैं जो किसी और को प्रदान करता है।
तम्मम्

ठीक है, इस चर्चा को अपग्रेड करने देता है - मैं कुछ और चीजें सीखने की आशा कर रहा हूँ :)
बाल्ड्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.