विजुअल स्टूडियो 2005 में ऑब्जेक्ट फाइलों का पुन: उपयोग करना

यहां स्थिति है:

मेरे पास दो परियोजनाओं के साथ एक वीएस2005 समाधान है: माईडेल (डीएलएल), माईडल यूनीटटेस्ट (कंसोल एक्सई)।

माईडल में मेरे पास माईक्लास नामक एक कक्षा है जो डीएलएल के लिए आंतरिक है और इसे निर्यात नहीं किया जाना चाहिए। मैं इसे MyDllUnitTest में जांचना चाहता हूं, इसलिए मैंने MyClassTest नामक एक टेस्ट सूट क्लास जोड़ा, जहां मैं MyClass के उदाहरण बनाते हैं और उनका परीक्षण करता हूं।

मेरा प्रश्न: MyDllUnitTest EXE पर MyDll के निर्माण द्वारा बनाई गई MyClass की ऑब्जेक्ट फ़ाइल को मैं कैसे लिंक कर सकता हूं? मैं MyDllUnitTest में MyClass बनाना नहीं चाहता हूं और मैं कक्षा को निर्यात नहीं करना चाहता हूं।

I tried using the same Intermediate Directory for both projects (so object files are in the same directory) and using the References feature of VS2005 (right click project --> References --> Add New Reference...), but it didn't work - I still get a linking error (LNK2001).

Edit: I don't want to have the same source file in two projects - consider the face that I have many MyClass/MyClassTest, which means I have to duplicate each MyClass to a different project. I know it is possible to use the same object file in two projects, I've seen it done before but forgot how.

Edit: I've decided to put the files in both projects, so they are compiled twice. It turns out the "Reference" feature works automatically - but only for static lib projects.

0

5 उत्तर

मुझे लगता है कि आपको अपनी प्रोजेक्ट लिंकर सेटिंग्स में अतिरिक्त निर्भरताओं की अपनी सूची में .obj फ़ाइल को स्पष्ट रूप से जोड़ने की आवश्यकता है।

0
जोड़ा

आप एक ऑब्जेक्ट का उपयोग करने का भी प्रयास कर सकते हैं जो सभी ऑब्जेक्ट्स के साथ .lib उत्पन्न करता है।

Like in the answer from: Visual C++ link generated objs from referenced project

0
जोड़ा

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

यदि आप कक्षा को निर्यात किए बिना डीएलएल का परीक्षण करना चाहते हैं (मुझे लगता है कि ऐसा इसलिए है क्योंकि एक डीएल में कक्षाओं को निर्यात करना आमतौर पर एक बुरा विचार है), डीएल से "फैक्ट्री" फ़ंक्शन निर्यात करने पर विचार करें। यह एक हस्ताक्षर होगा जैसे:

extern "C" MyClass *CreateMyClass();

यह फ़ंक्शन MyClass का ऑब्जेक्ट बनाएगा और इसमें एक पॉइंटर लौटाएगा। आपका यूनिट टेस्ट तब लौटाए गए क्लास ऑब्जेक्ट के साथ जो कुछ भी चाहिए उसे कर सकता है।

0
जोड़ा

यह करने का प्रयास करने का एक वैकल्पिक तरीका यहां है कि आप क्या करने की कोशिश कर रहे हैं लेकिन मेरा मानना ​​है कि यह आपकी आवश्यकताओं को पूरा करेगा ...

उन असेंबली पर InternalsVisibleToAttribute विशेषता का उपयोग करें जिसमें वे कक्षाएं हैं जिन्हें आप परीक्षण करना चाहते हैं। फिर यदि आप इस असेंबली का संदर्भ देते हैं तो आप कक्षाओं का परीक्षण करने में सक्षम होंगे, भले ही अन्य असेंबली इन प्रकारों को "अदृश्य" हों। जादू!

उपयोग करने के लिए विशेषता का एमएसडीएन संदर्भ यहां दिया गया है ...

http://msdn.microsoft.com/en- हमें/पुस्तकालय/system.runtime.compilerservices.internalsvisibletoattribute.aspx

0
जोड़ा
क्षमा करें, मैंने सोचा कि यह स्पष्ट था कि मैं देशी सी ++ का उपयोग कर रहा हूं
जोड़ा लेखक kshahar, स्रोत

मैं यहां क्या करता हूं "हेडर फ़ाइलें" और "स्रोत फ़ाइलें" के साथ परीक्षण प्रोजेक्ट में अतिरिक्त 'फ़िल्टर' "ऑब्जेक्ट फ़ाइलें" बना रहा है, और वहां सभी आवश्यक .obj फ़ाइलों को डालने (जो उनके पास आसान है पहले से ही उत्पन्न किया गया है)। ऐसा लगता है कि यह ठीक काम करता है। हम यहां यूनिट परीक्षण के लिए भी उपयोग करते हैं, और कुछ स्थानों पर दो अलग-अलग DLLs के लिए इसका उपयोग करते समय एक ही स्रोत फ़ाइल को संकलित नहीं करने के लिए।

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

0
जोड़ा