2013-01-16 13 views
5

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

इन फ़ोल्डरों में से दो में, मेरे पास एक ही नाम वाली फ़ाइलें हैं। उदा।

\MyProject\foo\Blurp.cpp 
\MyProject\foo\File.cpp 
\MyProject\bar\File.cpp 
\MyProject\bar\Knoll.cpp 

परियोजना पार मंच है, और मैं Linux और OSX पर autoconf उपयोग करें, लेकिन (कुछ 3 पार्टी सी ++ पुस्तकालयों मैं compilers भर W32 और सी पर उपयोग ++ द्विआधारी इंटरफ़ेस असंगति के कारण) W32 पर MSVC का उपयोग करना

एमएसवीसी पक्ष पर, परियोजना को कई "फ़िल्टर" (उन वर्चुअल फ़ोल्डर्स) में भी व्यवस्थित किया गया है (साथ ही फाइलों में डायरेक्ट्रीज के साथ संबंधित नामों के साथ), इसलिए मैं उन्हें अलग कर सकता हूं।

अब समस्या है, जब मैं इस परियोजना का निर्माण, MSVC वस्तु फ़ाइलों एक भी फ्लैट diretory में डालता है, और मैं अंत:

\MyProject\Release\Blurp.obj 
\MyProject\Release\File.obj 
\MyProject\Release\Knoll.obj 

के रूप में देखा जा सकता है, वहाँ केवल एक ही File.obj है, तो एक बाइनरी ऑब्जेक्ट गुम है। जाहिर है, लिंकर शिकायत करता है, क्योंकि यह उस लापता ऑब्जेक्ट फ़ाइल में परिभाषित कक्षाओं/कार्यों/... को नहीं ढूंढ सकता है।

एमएसवीसी को उन फ़ाइलों को निर्देशिका (या फ़िल्टर) के आधार पर एक अद्वितीय नाम के साथ ऑब्जेक्ट फ़ाइलों को बनाने के लिए कहने का कोई तरीका है?

\MyProject\Release\foo\Blurp.obj 
\MyProject\Release\foo\File.obj 
\MyProject\Release\bar\File.obj 
\MyProject\Release\bar\Knoll.obj 

या

\MyProject\Release\foo-Blurp.obj 
... 

या जो कुछ भी:

मैं की तरह कुछ कल्पना। मुझे पता है कि अन्य सभी बिल्ड-सिस्टम (सीएमके, ऑटोोटूल) एक ही नाम की कई फाइलों से निपटने में सक्षम हैं।

यह प्रश्न 3729515 के समान है, लेकिन मैं वर्तमान में VS2008 पर अटक गया हूं। (- प्रश्न में प्रत्येक फ़ाइल के लिए वस्तु निर्देशिका स्थापित करने के लिए - समाधान VS2008 के लिए वहाँ का सुझाव दिया जो कुछ वास्तव में सैद्धांतिक रूप से काम करता है, लेकिन जो मैं व्यावहारिक कारणों के लिए से बचने के लिए चाहते हैं)

उत्तर

6

आप एक फ़ाइल सेट कर सकते हैं एक (या दोनों) फ़ाइलों को संघर्ष और सेट "ऑब्जेक्ट फ़ाइल नाम" के लिए विशिष्ट परियोजना स्थापित करने के लिए संपत्ति:

$(InputDir)\$(IntDir)\ 

बस परियोजना नाम के बजाय फ़ाइल नाम पर राइट क्लिक करें कि के लिए गुण सेट करने के लिए केवल फाइल

उदाहरण के लिए, यदि आप उस \MyProject\foo\File.cpp के लिए तो है कि स्रोत फ़ाइल के लिए वस्तु फ़ाइल \MyProject\foo\Release\File.obj के लिए जाना जाएगा करते हैं तो यह \MyProject\bar\File.cpp के लिए वस्तु फ़ाइल के साथ संघर्ष नहीं होगा।

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

मैं व्यक्तिगत रूप से पसंद करता हूं कि $(InputDir)\$(IntDir)\ की एक परियोजना-व्यापी सेटिंग ऑब्जेक्ट फ़ाइलों को स्रोत फ़ाइल के सापेक्ष निर्देशिकाओं पर जाने का कारण बनती है, लेकिन यह वास्तव में प्रोजेक्ट लेवल सेटिंग के रूप में अच्छी तरह से काम नहीं करती है। उस स्थिति में वीएस अभी भी एक बार आउटपुट निर्देशिका सेट करता है और यह सूची में पहली स्रोत फ़ाइल के सापेक्ष होने के समाप्त होता है। फिर लिंकर इस बारे में भ्रमित हो जाता है कि उसे ऑब्जेक्ट फाइलों के लिए कहां देखना चाहिए।

$(IntDir)%(RelativeDir) 

जो स्रोत फ़ाइलों के रिश्तेदार स्रोत फ़ोल्डर का उपयोग करता है करने के लिए - (> आउटपुट फ़ाइलें Configurtion गुण> C/C++)

+0

इनपुट के लिए धन्यवाद; $ (इनपुटडियर) \ $ (IntDir) \ आशाजनक लग रहा है, और/लेकिन मैं वास्तव में यह चाहता हूं कि एक प्रोजेक्ट सेटिंग (कारण बताए गए कारणों से), अधिमानतः यहां तक ​​कि एक संपत्तिपत्र में भी, इसलिए परिवर्तन स्पष्ट हो जाता है। मैं अपने स्रोत पेड़ को छेड़छाड़ करने वाली ओबीजे-फाइलों के बारे में बहुत चिंतित नहीं हूं (भले ही कुल मिलाकर कुछ सैकड़ों ओबीजे-फाइलें उत्पन्न हों) –

+0

ठीक है, यह समाधान मेरे लिए काम नहीं करता है। मुझे "पथ ब्ला ब्ला ब्लै" नहीं मिल रहा है "के बारे में कुछ गलती हुई। तो, मैं एक और समाधान के साथ आया: मैंने अपने समाधान से "fileWithSameName.cpp" को बाहर रखा, और एक और जोड़ा, "AnotherFile.cpp" जो अंदर है केवल एकमात्र पंक्ति है: ["fileWithSameName.cpp" शामिल करें]। यह मेरे लिए काम करता है – Illidan

+3

यह वीएस 2015 में मेरे लिए काम नहीं करता है। लेकिन थोड़ा अलग संपत्ति मूल्य https://stackoverflow.com/questions/3695174/visual-studio-2010s-strange-warning-lnk4042/3731643# पर सुझाया गया है 3731643 काम करता है: $ (IntDir) /% (सापेक्ष डीआईआर)/ – peastman

8

शायद तुम परियोजना विस्तृत 'ऑब्जेक्ट फ़ाइल नाम' सेट कर सकते हैं। % पर ध्यान दें, लेकिन अगर आपकी स्रोत फाइलें आपकी प्रोजेक्ट निर्देशिका से बाहर हैं, तो ..\

+1

दरअसल आपको अंत में विभाजक और फ़ाइल नाम की आवश्यकता होती है। यह मेरे लिए हल किया गया: $ (IntDir) \% (सापेक्ष डीआईआर) \% (फ़ाइल नाम) .obj – Rudi

+0

धन्यवाद! एक आकर्षण के रूप में काम करता है। –

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