2015-06-21 6 views
6

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

मेरी लाइब्रेरी केवल विंडोज 8/7 में उपलब्ध कुछ फ़ंक्शंस/एनम वैल्यू/स्ट्रक्चर सदस्यों का उपयोग करती है।

मैं विंडोज एक्सपी, विंडोज विस्टा, विंडोज 7 और विंडोज 8/8.1 ओएस संस्करणों और x86, x64 और बांह आर्किटेक्चर के लिए लाइब्रेरी बनाने में सक्षम होना चाहता हूं, यानी एक ऐसा निर्माण नहीं जो सिर्फ विंडोज एक्सपी को लक्षित करता है और हर जगह काम करता है , लेकिन कई अलग-अलग विशिष्ट ओएसई को लक्षित करने में कई अलग-अलग निर्माण होते हैं, क्योंकि नए ओएस संस्करणों में मेरी लाइब्रेरी प्रदान करने वाली अधिक उपयोगी सुविधाएं होती हैं।

मेरे प्रश्न हैं:

  1. मैं किसी विशिष्ट OS संस्करण (अर्थात एक्सपी, विस्टा, 7, 8, 8.1, आदि) को लक्षित करने के संकलक बताऊँ?

  2. मैं एक विशिष्ट आर्किटेक्चर (यानी x86, x64, arm, आदि) को लक्षित करने के लिए संकलक कैसे कहूं?

  3. क्या होता है यदि मैं केवल विंडोज 8/7 में उपलब्ध फ़ंक्शंस/एनम वैल्यू/स्ट्रक्चर सदस्यों का उपयोग करता हूं लेकिन विंडोज लाइब्रेरी को लक्षित करने वाली अपनी लाइब्रेरी का निर्माण करता हूं? क्या संकलक मुझे चेतावनी देगा कि ऐसी चीजें विंडोज एक्सपी पर मौजूद नहीं हैं? या यह वास्तव में संकलित होगा लेकिन विंडोज एक्सपी सिस्टम पर चलाने में असफल रहा?

  4. जब मैं विंडोज एक्सपी के लिए संकलित करता हूं, तो मैं इसे कैसे बना सकता हूं, मेरा कोड उन चीजों पर छोड़ देता है जो Windows XP (Windows 7/8 फ़ंक्शंस और ऐसे) में मौजूद नहीं हैं?

  5. क्या इससे कोई फर्क पड़ता है कि मैं विभिन्न ओएस संस्करणों को लक्षित करते समय किस विंडोज एसडीके संस्करण का उपयोग करता हूं? ऐसा लगता है कि मैंने 8.1, 8.0 और 7.1 विंडोज एसडीके स्थापित किए हैं। क्या यह ठीक है अगर मैं हमेशा विंडोज एक्सपी को लक्षित करते समय भी नवीनतम एसडीके संस्करण का उपयोग करता हूं?

यहाँ कुछ जवाब मैंने पाया है, जो मुझे यकीन है कि नहीं कर रहा हूँ कर रहे हैं सही है या पूरा कर रहे हैं:

  1. मैं सिर्फ _WIN32_WINNT निर्धारित करने की आवश्यकता है और WINVERappropriate values for the target system को परिभाषित करता है और बस इतना ही, मैं ' इसके अलावा कुछ भी सेट करने की आवश्यकता नहीं है, मेरा आवेदन केवल उस सिस्टम के साथ निर्दिष्ट सिस्टम (यानी विंडोज एक्सपी) पर चलाएगा।

    • मैं जब साथ संकलक वातावरण चर की स्थापना उपयुक्त विकल्प का उपयोग करने की आवश्यकता "C: \ प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 12.0 \ कुलपति \ vcvarsall.bat", यानी "C: \ प्रोग्राम फ़ाइलें (x86) \ 64 विजुअल स्टूडियो 12.0 \ VC \ vcvarsall.bat amd64 "64 बिट के लिए।
    • मुझे लिंकर को appropriate /SUBSYSTEM value निर्दिष्ट करने की आवश्यकता है, यानी /SUBSYSTEM:WINDOWS,5.02 या /SUBSYSTEM:WINDOWS,6.00 x64 के लिए। लेकिन 5.02 और 6.00 के बीच क्या अंतर है? दो मान एक ही चीज़ (64-बिहार) क्यों निर्दिष्ट करते हैं? 5.01 और 6.00 के लिए वही, वे दोनों 32-सीधाई क्यों निर्दिष्ट करते हैं? मैं कल्पना करता हूं कि 64/32 बिट के लिए एक सिंगल वैल्यू पर्याप्त होगा।

      • उन मूल्यों (5.01, 5.02 और 6.00) WINVER से से मंच मूल्यों के समान दिखाई (1)।क्या वे आर्किटेक्चर के अलावा लक्ष्य ओएस भी सेट करते हैं? लेकिन WINVER=502 से (1) का उपयोग विंडोज सर्वर 2003 को लक्षित करने के लिए किया जाता है, जिसे विकिपीडिया के अनुसार 64-बिट और 32-बिट संस्करणों में रिलीज़ किया गया था, लेकिन यहां 5.02 कड़ाई से 64-बिट के लिए खड़ा है, जो समझ में नहीं आता है .. ।
  2. संकलक संकलित करने के लिए क्योंकि WINVER से परिभाषित (1) कार्य करता है और सामान OS को लक्षित में मौजूद नहीं (विंडोज हेडर फाइल उपयोग कि #ifdef चीजों को परिभाषित) शामिल नहीं होंगे विफल हो जाएगा।

  3. मुझे #ifdefWINVER पर आधारित अपने कोड में, जैसे कि विंडोज हेडर करते हैं, और आवश्यक होने पर अनुपलब्ध कार्यक्षमता के विकल्प प्रदान करते हैं।

  4. पता नहीं।

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

मैं लिनक्स विकास से आ रहा हूं, इसलिए विंडोज़ चीजें मेरे लिए थोड़ी नई हैं।

उत्तर

6

आपके अपने प्रश्नों के उत्तर आपके भाग के लिए सबसे सही हैं। कुछ स्पष्टीकरण और सुधार:

उपप्रणाली संस्करण लक्ष्य आर्किटेक्चर के लिए ऑर्थोगोनल है। /subsystem दस्तावेज कह रहा है कि न्यूनतम x86 के लिए उपप्रणाली संस्करण 5.01 है और न्यूनतम x64 के लिए उपप्रणाली संस्करण 5.02 है। कंसोल और विंडोज ऐप के लिए, उपप्रणाली संस्करण आंतरिक ऑपरेटिंग सिस्टम संस्करण संख्या के समान है। 5.01 x86 विंडोज एक्सपी है; 5.02 x64 विंडोज एक्सपी है। Windows XP के लिए दो अलग-अलग संस्करण संख्याएं हैं क्योंकि x64 Windows XP को x86 Windows XP से बाद में रिलीज़ किया गया था। सभी ओएसईएस के पास सभी आर्किटेक्चर के लिए समान संस्करण संख्या है (उदा।, विंडोज विस्टा x86 और x64 दोनों के लिए संस्करण 6.0 है)।

ध्यान दें कि उपप्रणाली संस्करण सेट करके, आप ऑपरेटिंग सिस्टम के सेट को प्रतिबंधित कर सकते हैं जिस पर आपका प्रोग्राम चल जाएगा। उदाहरण के लिए, यदि आप उपप्रणाली संस्करण 6.2 पर सेट करते हैं, तो आपका प्रोग्राम केवल विंडोज 8 और ऊपर चलाएगा। यदि आप प्रोग्राम को चलाने की कोशिश करते हैं उदा। विंडोज 7, यह नहीं चलेगा। (डीएलएल के लिए यह भी सच है: यदि आपके पास एक डीएलएल है जो ओएस की तुलना में ओएस को नए स्थान पर लक्षित करता है, तो लोडर कम से कम कोड निष्पादन के लिए डीएलएल लोड नहीं करेगा।)

विकिपीडिया का पृष्ठ देखें ऑपरेटिंग सिस्टम संस्करणों की एक सूची के लिए "List of Microsoft Windows versions"। विंडोज एक्सपी विजुअल स्टूडियो 2013 द्वारा समर्थित विंडोज का सबसे पुराना संस्करण है।

विंडोज 8 एसडीके केवल विंडोज विस्टा को सॉफ्टवेयर के विकास का समर्थन करता है। यदि आप Windows XP के निर्माण के लिए _WIN32_WINNT या WINVER सेट करना चाहते हैं, तो आपको विंडोज 7 एसडीके (विजुअल स्टूडियो 2013 दोनों एसडीके इंस्टॉल करना होगा) का उपयोग करना होगा।

जब तक आपका प्रोग्राम प्रत्येक लक्ष्य ऑपरेटिंग सिस्टम के लिए काफी अलग नहीं होता है, तो संभवत: एक बाइनरी बनाने के लिए यह बहुत आसान होगा जो कि सबसे पुराने ऑपरेटिंग सिस्टम (विंडोज एक्सपी) पर चलता है और या तो विलंब-लोड या गतिशील रूप से लोड होता है (LoadLibrary/GetProcAddress के माध्यम से) कोई कार्यक्षमता जिसे आप नए ऑपरेटिंग सिस्टम से उपयोग करना चाहते हैं, जब वह कार्यक्षमता उपलब्ध हो।

+0

जब विंडोज एक्सपी के लिए बिल्डिंग, मैं विंडोज 8 एसडीके के बजाय विंडोज 7 एसडीके का उपयोग करने के लिए विजुअल सी ++ कंपाइलर कैसे कहूं, जो डिफ़ॉल्ट रूप से प्रतीत होता है? क्योंकि '/ SUBSYSTEM निर्दिष्ट करने के अलावा: विंडोज़, 5।01' और '_WIN32_WINNT' और' WINVER' को '_WIN32_WINNT_WINXP (0x0501) पर सेट करना 'मुझे पुराने एसडीके का उपयोग करने की भी आवश्यकता है। –

+0

मुझे विंडोज 7 एसडीके का उपयोग करने की आवश्यकता है क्योंकि विंडोज 8 एसडीके विंडोज एक्सपी का समर्थन करने का दावा नहीं करता है। मैं देखता हूं कि विजुअल सी ++ 2010 विंडोज 7 एसडीके के लिए डिफ़ॉल्ट है, लेकिन मुझे सी ++ 11 की वजह से विजुअल सी ++ 2013 का उपयोग करना है, इसलिए मैं केवल विज़ुअल सी ++ 2010 का उपयोग नहीं कर सकता, मुझे विजुअल सी ++ 2013 बनाना है विंडोज 7 एसडीके का प्रयोग करें। –

+0

ऐसा लगता है कि जिस विज्ञान को मैं पर्यावरण चर सेट करने के लिए बुलाता हूं, 'सी: \ प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 12.0 \ वीसी \ vcvarsall.bat amd64', कॉल' सी: \ प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 12.0 \ वीसी \ बिन \ amd64', जो बदले में '% VS120COMNTOOLS% VCVarsQueryRegistry.bat' (जो 'सी: \ प्रोग्राम फ़ाइलें (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ Tools \ VCVarsQueryRegistry.bat' का मूल्यांकन करता है), जो विंडोज 8 एसडीके को इंगित करने के लिए चर सेट अप करने के लिए हार्डकोड किया गया। मुझे किसी और चीज को इंगित करने के लिए कोई स्विच नहीं दिख रहा है, उदाहरण के लिए विंडोज 7 एसडीके। –

4

क्षमा करें, यह बहुत लंबा :-(

होने की 1.How मैं, आदि एक विशिष्ट OS संस्करण (यानी एक्सपी, विस्टा, 7, 8, 8.1 लक्षित करने के लिए संकलक बताऊँ जा रहा है)?

आमतौर पर आप एक विशिष्ट OS संस्करण को लक्षित करने के संकलक बताऊँ नहीं। इसके बजाय आप एसडीके WINVER and _WIN32_WINNT का उपयोग करने से हेडर फाइल तैयार करें। हेडर फाइल sdkddkver.h उपयोगी नामित स्थिरांक

आप सेट करते हैं प्रदान करता है विजेता और _WI n32_WINNT उच्चतर हेडर फाइलें उन कार्यों को घोषित करती हैं जो केवल बाद के ओएस संस्करणों में उपलब्ध हैं (मान लीजिए कि आप एक एसडीके का उपयोग कर रहे हैं जो कि उन कार्यों को घोषित करने के लिए पर्याप्त नया है)।

लेकिन अब आपके पास एक ऐसा प्रोग्राम है जो पुराने ओएस संस्करणों पर मौजूद कार्यों को कॉल करता है। यदि आप भाग्यशाली हैं तो आपकी मदद करने के लिए कुछ प्रकार की संगतता शिम है। यदि आप दुर्भाग्यपूर्ण हैं तो अज्ञात फ़ंक्शन को कॉल करने का प्रयास विफल हो जाएगा। या असफल होने से कहीं ज्यादा बदतर है। लेकिन मेरे हिस्से पर यह राय है कि मुझे उद्धृत करने के लिए कुछ ठोस नहीं मिल रहा है।

2. मैं एक विशिष्ट आर्किटेक्चर (यानी x86, x64, arm, आदि) को लक्षित करने के लिए संकलक कैसे कहूं?

आप नहीं करते हैं। आप प्रत्येक लक्ष्य मंच के लिए एक अलग कंपाइलर का उपयोग करते हैं। आप C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ के तहत देखो, तो आप bin निर्देशिका और सात उप निर्देशिका मिल जाएगा:

amd64
amd64_arm
amd64_x86
हाथ
x86_amd64
x86_arm

आप करने के लिए उचित निर्देशिका से compilers का उपयोग उस मंच के लिए कोड बनाएं। विंडोज के Win32 संस्करण पर उपरोक्त पथ से '(x86)' ड्रॉप करें।

3.What होता है अगर मैं कार्य/enum मूल्यों/केवल Windows 8/7 में उपलब्ध संरचना के सदस्यों का उपयोग करें ...

मुझे यकीन है कि इस व्यवहार परिभाषित किया जाता है नहीं कर रहा हूँ। यदि आप _WIN32_WINNT को _WIN32_WINNT_WIN8 पर सेट करते हैं तो आप बहुत अधिक कह रहे हैं "मैं इसे विंडोज 8 और ऊपर चलाने के लिए चाहता हूं"। लेकिन यह मेरी राय निश्चित तथ्य नहीं है। यह हो सकता है कि मैंने दस्तावेज़ीकरण को पर्याप्त रूप से पर्याप्त रूप से नहीं पढ़ा है।

मैं इसे इसलिए जब मैं Windows XP के लिए संकलन, मेरे कोड चीजें हैं जो (विंडोज 7/8 कार्य करता है और इस तरह के) Windows XP में मौजूद नहीं हैं से अधिक छोड़ देता है 4.How कर सकता हूँ?

आपको इसके लिए स्पष्ट रूप से कोड करना होगा, मुझे विश्वास नहीं है कि आपके लिए इस समस्या को संभालने के लिए कुछ भी है। आप इसे #ifdef और _WIN32_WINNT का उपयोग करके संकलित समय पर कर सकते हैं या आप यह निर्धारित करके रनटाइम पर कर सकते हैं कि फ़ंक्शन को कॉल किया जा सकता है या फिर फ़ंक्शन को कॉल करना या फ़ंक्शन को उचित रूप से कॉल करने से बचें।

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

5. क्या यह अलग-अलग ओएस संस्करणों को लक्षित करते समय विंडोज एसडीके संस्करण का उपयोग करता है?

शायद। एसडीके के पुराने संस्करणों में बाद के ओएस संस्करणों के लिए फ़ंक्शन परिभाषाएं नहीं हो सकती हैं। उदाहरण के लिए जब एसडीके का Vista संस्करण बनाया गया था तो विंडोज 8 में पेश किए गए अधिकांश फ़ंक्शंस शायद मौजूद नहीं थे।

क्या यह ठीक है अगर मैं हमेशा विंडोज एक्सपी को लक्षित करते समय भी नवीनतम एसडीके संस्करण का उपयोग करता हूं?

शायद यह सबसे सुरक्षित काम है। यदि आप नवीनतम एसडीके का उपयोग करते हैं और _WIN32_WINNT__WINNT को _WIN32_WINNT_WINXP पर सेट करते हैं तो शायद सही बात होगी - मान लीजिए कि आप XP पर चलाना चाहते हैं।

मैं "शायद" कहता हूं क्योंकि XP ​​एक विशेष मामला है। यह असमर्थित है। नवीनतम एसडीके को XP मूल्य पर सेट _WIN32_WINNT के साथ परीक्षण किया जा सकता है या नहीं।

1.I सिर्फ _WIN32_WINNT निर्धारित करने की आवश्यकता है और winver को परिभाषित करता है ...

है कि आप एक कोड फ़ाइल है कि _WIN32_WINNT मूल्य से पहचान OS संस्करण पर सही ढंग से निष्पादित करेंगे मिलना चाहिए। यह संभवतः बाद के ओएस संस्करणों पर भी काम करेगा (माइक्रोसॉफ्ट ने एक नया ओएस संस्करण लाने पर मौजूदा कार्यक्रमों को तोड़ने के लिए काफी मेहनत की कोशिश की है)। यह _Win32_WINNT द्वारा पहचाने गए ओएस संस्करणों से पुराने तरीके से सही ढंग से नहीं चल सकता है या नहीं - मुझे इसका जोखिम नहीं होगा।

• मैं जब संकलक वातावरण चर

की स्थापना आप Nmake उपयोग कर रहे हैं जब से मैं इस एक का जवाब के बारे में सुनिश्चित नहीं हूँ उपयुक्त विकल्प का उपयोग करने के लिए की जरूरत है। Vcvarsall.bat फ़ाइल विभिन्न पर्यावरण चर सेट करता है जो (अन्य चीजों के साथ) नियंत्रित कर सकते हैं कि किस प्रकार के कंपाइलर्स का उपयोग किया जाता है (एमएसबीयूआईएलडी को कंपाइलर्स जैसे बाइनरी के लिए देखकर नियंत्रित किया जाता है)। लेकिन मुझे नहीं पता कि NMAKE MSBUILD चलाता है या उन पर्यावरण चर पर ध्यान देता है या इसका अपना अलग-अलग सेट या क्या है।

• मैं भी 64

सबसिस्टम प्रमुख/मामूली मूल्यों डॉन 'के लिए, लिंकर करने के लिए उपयुक्त/सबसिस्टम मूल्य निर्दिष्ट करने के लिए यानी /SUBSYSTEM:WINDOWS,5.02 या /SUBSYSTEM:WINDOWS,6.00 की जरूरत प्लेटफ़ॉर्म प्रकार (एआरएम, x86, x64, आदि) के साथ सीधे कुछ भी नहीं है। वे न्यूनतम ओएस स्तर निर्दिष्ट करते हैं जो कोड फ़ाइल चलती है। तो SUBSYSTEM 5.01 कहता है "यह कोड फ़ाइल XP पर चलती है" जबकि SUBSYSTEM 5.02 कहता है "यह कोड फ़ाइल Windows Server 2003 पर चलती है लेकिन XP पर नहीं"। आदर्श रूप से आपको पुराने ओएस संस्करण पर चल रहे फ़ाइल के जोखिम से बचने के लिए उप-प्रणाली प्रमुख/नाबालिग को _WIN32_WINNT से मेल खाना चाहिए जो इसका समर्थन नहीं कर सकता है।

कम से कम मुझे याद है - मेरे पास एक XP वातावरण नहीं है जिसका उपयोग मैं यह पुष्टि करने के लिए कर सकता हूं कि मैं इसे सही तरीके से याद कर रहा हूं।

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