2012-08-27 13 views
9

में वीसी ++ 2010 रनटाइम लाइब्रेरी का उपयोग करें मैं ऑप्टिमाइज़ेशन एल्गोरिदम पर काम करता हूं ताकि प्रदर्शन वास्तव में मायने रखता हो। वीएस 2008 की तुलना में वीएस 2010 में संकलित होने पर एल्गोरिदम लगभग 8 गुना तेज है। गुगलिंग से पता चलता है कि यह मेरी गलती नहीं है (उदाहरण के लिए https://stackoverflow.com/a/5560184/890355 देखें)। समस्या यह है कि अंतिम परियोजना वीएस 2008 के तहत बनाई जानी चाहिए।वीसी ++ 2008 प्रोजेक्ट

जो समाधान मैं करता हूं वह मेरे एल्गोरिदम को वीएस 2010 में डीएलएल के रूप में निर्मित करना है और फिर इसे मुख्य परियोजना से जोड़ना है। वीएस 2008 के तहत मेरे डीएलएल के साथ वीसी ++ 2010 रन-टाइम पुस्तकालयों का उपयोग करना संभव है? यदि हां, तो ऐसा करने का सबसे दर्दनाक तरीका क्या है? कोई अन्य विचार? धन्यवाद।

+0

सी ++ विजुअल स्टूडियो द्वारा इस्तेमाल किया संकलक C++ 0x का समर्थन नहीं करता है, तो वह यह है कि तुम क्या पूछ रहे हैं। निश्चित रूप से आप हमेशा एक और हालिया कंपाइलर का उपयोग कर सकते हैं यदि आप विजुअल स्टूडियो 2010 और/या विजुअल स्टूडियो 2012 में अपग्रेड करना चाहते हैं। एक संभावित समाधान ऑप्टिमाइज़ेशन एल्गोरिदम को एक अलग कंपाइलर का उपयोग करके संकलित करना है और केवल कंपाइलर द्वारा बनाए गए आउटपुट का संदर्भ देना है । –

+2

क्या आपके पुस्तकालय एक-दूसरे के बीच वस्तुओं को पार करते हैं, और एक-दूसरे से उन्हें अस्वीकार करने की उम्मीद करते हैं?लाइब्रेरी मिश्रण काम कर सकता है, लेकिन कुछ सुंदर सीमित चेतावनी हैं (और सी ++ कंटेनर का उपयोग करके खराब जादू हो सकता है): http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - संक्षेप में, यह आसान है अगर आप सबकुछ सुसंगत रख सकें और केवल एक सी ++ रनटाइम का उपयोग कर सकें। – birryree

+3

यह केवल एक अच्छा अंत में आ सकता है जब आप VS2010 से # अंतर्निहित फ़ाइलों का उपयोग करते हैं। जो काम नहीं करेगा, वीएस 2008 उन्हें संकलित नहीं कर सकता है, खासकर जब से आप सैमसंगिक्स परफ सुधार के बाद हैं। –

उत्तर

1

यदि आप 2008 के 2010 के पुस्तकालयों को एक निष्पादन योग्य में गठबंधन करने के लिए किसी भी अन्य तरीके से पूछते हैं तो 2010 के भाग को डीएलएल में बाहर ले जाने के अलावा, जवाब शायद "इसे हासिल करने का कोई और आसान तरीका नहीं है"।

लेकिन यदि आप "वीसी ++ 2010 रन-टाइम लाइब्रेरीज़ ... वीएस 2008 के तहत" नहीं चाहते हैं (जो कि पुराने 2008 आईडीई में 2010 पुस्तकालयों के खिलाफ निर्माण कर रहा है), लेकिन "2008 में संकलित डीएलएल का उपयोग करें संकलित कार्यक्रम ", यह पूरी तरह से संभव है।

सबसे आसान तरीका, जैसा कि हम अपनी परियोजनाओं में करते हैं, स्थिर रूप से जुड़े मानक पुस्तकालयों (एमएफसी, यदि आप इसका उपयोग करते हैं) के खिलाफ (दोनों .exe और DLL) बनाना है और फिर 0xका उपयोग अपने .exe में लोड करने के लिए करें। DLL। डीएलएल में आप (_declspec (dllexport)) एक फ़ंक्शन (अधिमानतः extern "C" {} गार्ड के अंदर) निर्यात कर सकते हैं और 0xके माध्यम से .exe में इसका उपयोग कर सकते हैं।

स्टेटिक लिंकेज और स्पष्ट लोडिंग आपको विभिन्न रनटाइम्स के कारण कई असंगतता बग से बचाती है।

यदि आप डीएलएल लोडिंग और फ़ंक्शन कॉलिंग लागतों के बारे में चिंतित हैं, तो आप इन कॉल को जितना संभव हो उतना दुर्लभ बनाने की कोशिश कर सकते हैं (शायद न केवल एल्गोरिदम को स्थानांतरित करके, बल्कि डीएलएल में कुछ और उच्च स्तरीय तर्क भी)। this issie भी देखें।

और आप native multitargeting का उपयोग करके एक आईडीई (2010) में अपना पूरा कोड बना सकते हैं (हालांकि आपको अभी भी मुख्य रूप से मुख्य ऐप और डीएलएल को वी 9 और वी 10 पुस्तकालयों के खिलाफ अलग-अलग बनाने की आवश्यकता होगी)।

3

रनटाइम्स कोई समस्या नहीं है। वीसी -2010 रनटाइम के खिलाफ अपने डीएलएल को जोड़ने और फिर अन्य परियोजनाओं में उस डीएलएल का उपयोग करने से आपको कुछ भी नहीं रोकता है। इससे कोई फर्क नहीं पड़ता कि उन परियोजनाओं को विजुअल सी ++ 2008 या किसी अन्य भाषा का उपयोग करके बनाया गया है।

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

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