15

पर मैंने वेब और स्टैक ओवरफ्लो को बहुत कुछ खोजा है, लेकिन मेरे निम्नलिखित प्रश्नों का एक निश्चित उत्तर नहीं मिल रहा है।पोर्टिंग क्रॉस-प्लेटफ़ॉर्म सी ++ लाइब्रेरीज़ विंडोज फोन 8 प्लेटफार्म

प्रसंग:

मैं बंदरगाह के लिए विंडोज फोन 8 (WP8) मंच के साथ उपयोग के लिए सी ++ हेल्पर लाइब्रेरी के एक समूह देख रहा हूँ। ऐतिहासिक रूप से, इन पुस्तकालयों को स्थिर libs (डीएलएल के बजाए) के रूप में बनाया गया है।

मैंने सफलतापूर्वक WP8-विशिष्ट कोड लिखा है, ताकि पुस्तकालय WP8 के लिए उपलब्ध एपीआई (संदर्भ बिंदु के रूप में WP API क्विकस्टार्ट दस्तावेज़ का उपयोग करके) एआरएम के खिलाफ संगत और निर्माण कर रहे हों। WinRT के ThreadPool के साथ क्लासिक Win32 थ्रेड कॉल को प्रतिस्थापित करने के कारण, केवल पुस्तकालयों में से एक (उदा। Lib1) को WinRT एक्सटेंशन (/ ZW ध्वज) की खपत की आवश्यकता होती है।

जब लिब 1 का निर्माण होता है, तो मुझे निम्न चेतावनी मिलती है: चेतावनी 1 चेतावनी LNK4264: एक स्थिर पुस्तकालय में/ZW के साथ संकलित ऑब्जेक्ट फ़ाइल संग्रहित करना; ध्यान दें कि विंडोज रनटाइम प्रकारों को संलेखित करते समय इसे एक स्थिर लाइब्रेरी से लिंक करने की अनुशंसा नहीं की जाती है जिसमें विंडोज रनटाइम मेटाडेटा होता है।

- इस चेतावनी के लिए खोज, मैं this article पाया, उन्होंने कहा: "आप एक स्थिर पुस्तकालय है कि सार्वजनिक रेफरी कक्षाएं, सार्वजनिक इंटरफ़ेस कक्षाएं, या सार्वजनिक मूल्य वर्गों बनाता उपभोग करते हैं, तो लिंकर इस चेतावनी को जन्म देती है आप सुरक्षित रूप से अनदेखा कर सकते हैं। चेतावनी अगर स्थिर लाइब्रेरी विंडोज रनटाइम घटकों का उत्पादन नहीं कर रही है जो लाइब्रेरी के बाहर खपत की जाती हैं। स्थिर पुस्तकालय में सार्वजनिक घटक संकलित होंगे लेकिन रन टाइम पर सक्रिय नहीं होंगे। किसी भी विंडोज रनटाइम घटक जो अन्य घटकों या ऐप्स द्वारा खपत के लिए है गतिशील-लिंक लाइब्रेरी (डीएलएल) में कार्यान्वित किया गया। "

लिब 1 में, कक्षाए में WinRT ThreadPool कॉल का उपयोग करके फ़ंक्शन शामिल हैं। क्लासए कार्यों को क्लासबी द्वारा बुलाया जाता है, और वे नियमित रूप से हैंडल और डीडब्ल्यूओआरएस को कक्षाबी में वापस कर देते हैं।

कोड उदाहरण:

// ClassA.cpp 
HANDLE WINAPI ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */) 
{ 
    // Do WinRTThreadPool stuff to create WorkItem 
    auto workItem = ref new Windows::System::Threading::WorkItemHandler([=](Windows::Foundation::IAsyncAction^) 
    // More code that eventually results in a Win32 Handle 

    return handle; 
} 

// ClassB.cpp 
Handle handle = ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */); 

ClassA के कार्यों ही कभी, ClassB द्वारा बुलाया जाएगा Lib1 के भीतर से, और ClassB तो Lib1 जोड़ने आवेदन के द्वारा प्रयोग किया जा सकता है।

अंत में, अपने सवालों के:

  1. कर सकते हैं सी ++ पुस्तकालयों ऐसा नहीं WinRT एक्सटेंशन (/ ZW) उपभोग करते हैं, जब स्थिर libs के रूप में बनाया गया है, विंडोज फोन द्वारा इस्तेमाल किया जा 8 अनुप्रयोगों ?

  2. सी ++ पुस्तकालय (Lib1) कि का उपभोग करता है सकते हैं WinRT एक्सटेंशन (/ ZW), जब एक स्थिर lib के रूप में बनाया गया है, चेतावनी के बावजूद, Windows Phone 8 अनुप्रयोगों द्वारा इस्तेमाल किया जा?

  3. जवाब या तो सवाल है, मैं, संबंधित पुस्तकालय में कक्षाओं के सभी के लिए WinRT घटक रैपर बनाना पड़ेगा this article तरह मैंडलब्रॉट एल्गोरिथ्म के साथ प्रदर्शित करता है कि करने के लिए नहीं है, तो? या क्या मैं कुछ और याद कर रहा हूँ?

आपके द्वारा प्रदान किए जा सकने वाले किसी भी इनपुट के लिए अग्रिम धन्यवाद।

उत्तर

5

प्रश्न 1 हां, जब तक आप किसी भी API, जैसे Win32, MFC, आदि मानक ग सुविधाओं में से कुछ है कि फोन पर की अनुमति नहीं है उपयोग नहीं कर रहे के रूप में उनके आसपास कुछ कमी है, उदाहरण के लिए आप केवल उन फ़ाइलों पर फॉपेन कॉल कर सकते हैं जो आपके अनुप्रयोग स्थानीय क्षेत्र में हैं। बेशक, आप केवल सी ++ कोड से अपने स्थिर lib में कार्यक्षमता तक पहुंच सकते हैं। यह परिदृश्य वह है जिसे मैं "सादा पुराना सी ++" परिदृश्य कहता हूं। यह बढ़िया काम करता है।

प्रश्न 2 हाँ, जब तक कि किसी भी रेफरी वर्गों है कि आप है कि स्थिर lib में परिभाषित ही नहीं स्थिर lib के भीतर से इस्तेमाल किया जा करने का इरादा कर रहे हैं। तो आपके उदाहरण में, जब तक कक्षा ए नियमित रूप से पुरानी सी ++ कक्षा है, तो आप ठीक होंगे। अनिवार्य रूप से आपके पास रेफ क्लास नहीं हो सकते हैं जो सार्वजनिक कक्षाओं के रूप में एक ही एनईटी असेंबली में सार्वजनिक हैं, क्योंकि इसके लिए कुछ COM-on-steroids जादू की आवश्यकता होती है, और यह केवल विंडोज रनटाइम घटक में संकलित हो जाता है। यदि आपके पास सादा पुराना सी ++ कोड है जो किसी भी रेफ क्लास कोड पर आपकी कॉल के चारों ओर लपेटता है, और आपके स्थैतिक lib का उपभोग करने वाला कोड इसे सादे पुराने सी ++ तरीके से उपभोग करता है, तो आप ठीक हैं। तर्क से पता चलता है कि आप स्थिर lib के बाहर WinRT प्रकारों को पारित करने में सक्षम नहीं होंगे, हालांकि मैंने अभी तक उस धारणा का परीक्षण नहीं किया है।

प्रश्न 3 मेरा मानना ​​है कि लेख है कि आप संदर्भ तथ्य यह है कि एक स्थिर lib में कोड रेफरी कक्षाएं आदि का उपयोग कर सकते हैं, तो चिंता मत करो याद करते हैं, आप के आसपास विंडोज रनटाइम घटक रैपर लिखने की जरूरत नहीं है अपने स्थिर libs। आप केवल ऐसा करना चाहते हैं यदि आप चाहते हैं कि आपकी स्थिर lib में कोड "पब्लिक क्लासेस" (.NET असेंबली अर्थ में) के माध्यम से उपलब्ध हो।

याद रखने की बात यह है कि आप अभी भी विंडोज स्टोर के लिए एक स्थिर lib "बना रहे हैं। यह मूल कोड है, लेकिन यह अभी भी सभी सी ++/सीएक्स सामान कर सकता है, इसमें COM सक्रियण सामग्री शामिल नहीं है ताकि इसे परिभाषित प्रकारों को स्थिर रूप से जुड़े C++ परिदृश्य के बाहर सुलभ किया जा सके।

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