Visual Studio C ++ प्रोजेक्ट फ़ाइलों को उत्पन्न करने के लिए CMake का उपयोग करना


91

मैं एक ओपन सोर्स C ++ प्रोजेक्ट पर काम कर रहा हूं, जो कोड के लिए लिनक्स और विंडोज पर संकलित है। लिनक्स पर कोड बनाने के लिए मैं CMake का उपयोग करता हूं। विकास सेटअप और राजनीतिक कारणों में आसानी के लिए, मुझे विंडोज पर विज़ुअल स्टूडियो प्रोजेक्ट फाइलों / संपादक से चिपके रहना चाहिए (मैं कोड :: ब्लॉक पर नहीं जा सकता , उदाहरण के लिए)। मुझे सीएमके का उपयोग करते हुए विज़ुअल स्टूडियो फ़ाइलों को बनाने के निर्देश मिलते हैं, यहाँ

क्या आपने पहले Visual Studio फ़ाइलों को जनरेट करने के लिए CMake का उपयोग किया है? आपका अनुभव कैसा रहा है? मान लीजिए कि मैं अपनी परियोजना में एक नई फ़ाइल जोड़ना चाहता हूं। इसके लिए वर्कफ़्लो क्या है?


1
जीएनयू + लिनक्स में उन लोगों के लिए जो विजुअल स्टूडियो के लिए प्रोजेक्ट फाइल बनाने की कोशिश कर रहे हैं, जो कि विंडोज-विशिष्ट है, इस उत्तर को ध्यान में रखें। TL; DR: जेनरेटर प्लेटफ़ॉर्म-विशिष्ट हैं और ऐसा करने के लिए आपको विंडोज में होना चाहिए।
कोड_ड्रेड

जवाबों:


57

CMake वास्तव में इसके लिए बहुत अच्छा है। महत्वपूर्ण पक्ष यह था कि विंडोज साइड में सभी को समाधान में लोड करने से पहले सीएमके को चलाने के लिए याद रखना होगा, और हमारे मैक पक्ष में हर किसी को इसे बनाने से पहले इसे चलाने के लिए याद रखना होगा।

सबसे कठिन हिस्सा एक विंडोज़ डेवलपर के रूप में था, जो यह सुनिश्चित करता है कि आपके संरचनात्मक परिवर्तन cmakelist.txt फ़ाइल में थे और समाधान या प्रोजेक्ट फ़ाइलों में नहीं थे क्योंकि वे परिवर्तन शायद खो जाएंगे और भले ही नहीं खोए हों मैक पक्ष को स्थानांतरित नहीं किया जाएगा जो उन्हें भी जरूरत थी, और मैक लोगों को उन्हीं कारणों से मेक फाइल को संशोधित नहीं करने के लिए याद रखना होगा।

इसके लिए बस थोड़ा विचार और धैर्य की आवश्यकता है, लेकिन पहले गलतियाँ होंगी। लेकिन अगर आप दोनों तरफ निरंतर एकीकरण का उपयोग कर रहे हैं तो ये जल्दी बाहर हो जाएंगे, और लोग अंततः आदत में आ जाएंगे।


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

1
इसके लिए चेतावनी यह है कि आपको IDE के माध्यम से विजुअल स्टूडियो कंपाइलर को चलाने की आवश्यकता नहीं है। आप इसे कमांड लाइन पर चला सकते हैं:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy

2
यह भी देखें @PfunnyGuy cmake --build .
गुप्त रूप से

@ धन्यवाद! मैं वास्तव में पाया कि, और उपयोग करें cmake --build . --config Debug -- /nologo /verbosity:minimal /m। मैं . target run_testsअपने googletest यूनिट परीक्षण को चलाने के बाद सम्मिलित करूंगा, और "डीबग" को "रिलीज़" से बदला जा सकता है। (डिबग के लिए कॉन्फ़िगरेशन विकल्प जोड़ना वैकल्पिक है, क्योंकि यह डिफ़ॉल्ट है, लेकिन मैंने इसे यह दिखाने के लिए शामिल किया कि इसे "रिलीज़" के साथ कैसे स्वैप किया जा सकता है)
PfunnyGuy

47

निश्चित नहीं है कि यह सीधे सवाल से संबंधित है, लेकिन मैं कैसे उत्पन्न करने के लिए एक उत्तर की तलाश कर रहा था *। cmake परियोजनाओं से मुझे पता चला है कि कोई इस तरह का उपयोग कर सकता है:

cmake -G "Visual Studio 10"

उदाहरण एक इनपुट CMakeLists.txt फ़ाइल से वीएस 2010 फ़ाइलों की आवश्यकता उत्पन्न करता है


1
पर stackoverflow.com/questions/11269833/... @Ivan अंक बाहर है कि यह आपके उच्च-स्तरीय CMakeLists.txt को उसी फ़ोल्डर में एक फ़ाइल PreLoad.cmake में रखा जा सकता है और फिर तुम सिर्फ कर सकते हैं cmake
PfunnyGuy

25

हमने अपने विभाग की निर्माण श्रृंखला को CMake में स्थानांतरित कर दिया, और हमारे पास कुछ आंतरिक रोडबम्प्स थे जो अन्य विभागों के लिए थे जहाँ हमारी परियोजना फाइलों का उपयोग किया गया था और जहाँ उन्हें अपने समाधान में आयात करने का आदी था। सीएमके के बारे में हमारे पास कुछ शिकायतें भी थीं कि विजुअल स्टूडियो प्रोजेक्ट / सॉल्यूशन मैनेजर में पूरी तरह से एकीकृत नहीं किया जा रहा था, इसलिए सीएमकेलाइस्ट.टेक्स्ट में मैन्युअल रूप से फाइलें जोड़ी जानी थीं; यह वर्कफ़्लो लोगों के लिए इस्तेमाल किया गया था में एक बड़ा ब्रेक था।

लेकिन सामान्य तौर पर, यह काफी सहज संक्रमण था। हम बहुत खुश हैं क्योंकि हमें अब प्रोजेक्ट फाइलों से निपटना नहीं है।

एक परियोजना में एक नई फ़ाइल जोड़ने के लिए ठोस वर्कफ़्लो वास्तव में सरल है:

  1. फ़ाइल बनाएं, सुनिश्चित करें कि यह सही जगह पर है।
  2. फ़ाइल को CMakeLists.txt में जोड़ें।
  3. बिल्ड।

यदि कोई CMakeList.txt फाइलें बदल गई हैं (और (सेमी-) स्वचालित रूप से समाधान / परियोजनाओं को फिर से लोड करता है) तो CMake 2.6 अपने आप ही पुन: चालू हो जाता है।

याद रखें कि यदि आप आउट-ऑफ-सोर्स बिल्ड कर रहे हैं, तो आपको बिल्ड डायरेक्टरी में सोर्स फ़ाइल बनाने के लिए सावधान रहने की आवश्यकता है (क्योंकि विज़ुअल स्टूडियो केवल बिल्ड डायरेक्टरी के बारे में जानता है)।


9

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

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


7

CMake विजुअल स्टूडियो प्रोजेक्ट्स और सॉल्यूशंस का निर्बाध रूप से उत्पादन करता है। आप सीएमके फ़ाइलों में कोई भी बदलाव किए बिना विभिन्न विज़ुअल स्टूडियो संस्करणों के लिए प्रोजेक्ट / समाधान भी बना सकते हैं।

स्रोत फ़ाइलों को जोड़ना और हटाना केवल उन फ़ाइलों को संशोधित CMakeLists.txtकरने और परियोजनाओं / समाधानों को पुनर्जीवित करने की सूची को संशोधित करने का एक मामला है । एक निर्देशिका में सभी स्रोतों को खोजने के लिए एक ग्लोबिंग फ़ंक्शन भी है (हालांकि इसे सावधानी के साथ उपयोग किया जाना चाहिए)।

निम्न लिंक सीएमके और विजुअल स्टूडियो के विशिष्ट व्यवहार को बहुत अच्छी तरह से समझाता है।

CMake और विजुअल स्टूडियो


यह लिंक और इसकी नमूना परियोजना बहुत उपयोगी है, इसके लिए धन्यवाद! मैं आपके उत्तर में github रेपो से कुछ स्रोत कोड को शामिल करने की सलाह दूंगा, उदाहरण के लिए कि एक CMake परियोजना एक समाधान के बराबर है, और यह कि add_executable की तरह कुछ का उपयोग दृश्य स्टूडियो परियोजना के बराबर जोड़ने के लिए किया जाता है।
jrh

5

CMake वास्तव में अच्छा Visual Studio .projs/ उत्पन्न कर सकता है .slns, लेकिन .cmakeफ़ाइलों को संशोधित करने की आवश्यकता के बजाय हमेशा समस्या है .proj/ .sln। जैसा कि यह अब है, हम इसके साथ काम कर रहे हैं:

  1. /srcविजुअल स्टूडियो में दिखाई देने वाली सभी स्रोत फाइलें और फाइलें उन तक पहुंचने के लिए सिर्फ "लिंक" हैं .filter
  2. प्रोग्रामर परिभाषित /srcनिर्देशिका पर काम करने के लिए याद रखने वाली फाइलों को जोड़ता / हटाता है , डिफ़ॉल्ट प्रोजेक्ट के नहीं।
  3. जब वह किया जाता है, तो वह एक स्क्रिप्ट चलाता है जो संबंधित .cmakeफ़ाइलों को "ताज़ा" करता है ।
  4. वह जांचता है कि कोड को फिर से बनाए गए वातावरण में बनाया जा सकता है या नहीं।
  5. वह कोड करता है।

पहले हम थोड़ा डरते थे कि यह कैसे निकलेगा, लेकिन वर्कफ़्लो वास्तव में अच्छी तरह से काम करता है और प्रत्येक कमिटमेंट से पहले दिखाई देने वाले अच्छे अंतर के साथ, हर कोई आसानी से देख सकता है कि क्या उसके बदलावों को .cmakeफाइलों में सही ढंग से मैप किया गया था ।

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


4
सीएमके 2.8.10 के रूप में, उत्पन्न समाधान में 4 प्रथागत निर्माण विन्यास हैं, और अतिरिक्त कस्टम को परिभाषित करने के लिए समर्थन है।
जॉन


0

मैंने अपना खुद का प्रोजेक्ट शुरू किया है, जिसे सिंकप्रोज कहा जाता है। दस्तावेज / डाउनलोड लिंक यहाँ से:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

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

अन्य मेक सिस्टम की तुलना में मुख्य लाभ यह है कि आप वास्तव में अपनी स्क्रिप्ट को डीबग कर सकते हैं, क्योंकि यह C # आधारित है।

यदि आप SyncProj से परिचित नहीं हैं, तो आप अपने समाधान / प्रोजेक्ट को .cs स्क्रिप्ट में परिवर्तित कर सकते हैं, और उस बिंदु से आगे का विकास जारी रख सकते हैं।

सेमीके में आपको स्क्रैच से सब कुछ लिखने की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.