2009-02-21 12 views
9

में हेडर पथ परिवर्तन शामिल करें मैं विंडोज़ से लिनक्स में सी ++ में लिखे गए एक एप्लीकेशन को पोर्ट कर रहा हूं। मुझे हेडर फाइल पथ में कोई समस्या है। विंडोज \ का उपयोग करता है और लिनक्स / का उपयोग करता है। मुझे इसे प्रत्येक स्रोत और हेडर फ़ाइल में बदलने के लिए बोझिल लग रहा है। क्या वहां कुछ काम है?विंडोज़ से लिनक्स

+13

जब आप अंत में है कि ठीक, याद के आधार पर इस आदेश की कोशिश कर सकते हैं: कभी बैकस्लैश कभी नहीं का उपयोग करें। फॉरवर्ड स्लैश विंडोज और लिनक्स दोनों में काम करते हैं। –

उत्तर

26

हमेशा # अंतर्निहित पथों में आगे की स्लैश का उपयोग करें। अंतर्निहित ओएस समर्थन जो भी स्लैश/निर्देशिका योजना के मार्ग को मैप करने के लिए यह संकलक का काम है।

+13

-1। आईएमएचओ आप गलत सवाल का जवाब दे रहे हैं - लड़के के पास पहले से ही फाइलों का ढेर है जिसमें बैकस्लाश # पथ शामिल हैं। उसे एम्बुलेंस की जरूरत है, किसी को यह बताने के लिए कि उसे इतना तेज़ नहीं होना चाहिए था। –

+0

अच्छा सवाल! मुझे लगता है कि उनका मतलब था कि वह परियोजनाओं के बीच चलने के दौरान/और \ के बीच लगातार स्वैप करना चाहते हैं। (ओपी क्या आप कृपया स्पष्टीकरण दे सकते हैं?) ओपी की राय के बारे में ओपी की राय के बाद से ओपी की राय छोड़ दी गई है :) –

+0

@j_random_hacker वे पोर्टिंग कर रहे हैं (कम से कम, जब वह सवाल लिखा गया था) तो वे अभी भी हैं ड्राइविंग और अभी तक दुर्घटनाग्रस्त हैं। उनकी फाइलों में स्लेश की दिशा फ़्लिप करना एक एकल पर्ल स्टेटमेंट है। –

4

आप किस संस्करण का उपयोग कर रहे हैं? जहां तक ​​मुझे पता है, विंडोज एक्सपी से शुरू होने पर, फॉरवर्ड स्लैश वास्तव में पथ डिलीमीटर के रूप में काम करते हैं।

+1

मुझे लगता है कि ओपी विंडोज से लिनक्स तक जा रहा है, लिनक्स से विंडोज –

+0

वास्तव में एप्लिकेशन को विभिन्न प्लेटफार्मों के लिए कोड किया गया है। और मैं किसी और द्वारा कोडित फ़ाइलों का उपयोग कर रहा हूं। मुझे यह जानने में दिलचस्पी है कि क्या स्लेश को आगे बढ़ाने या कुछ समान प्रभाव प्राप्त करने के लिए बैकस्लैश को बदलने का एक आसान तरीका है। –

5

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

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

#include:b+<{[^\\\>]}\\ 

अपनी खोज को अभिव्यक्ति के लिए और प्रतिस्थापन एक्सप्रेशन (चेतावनी: अपरीक्षित) के लिए

#include <\1 

:

उदाहरण के लिए, कुछ इस तरह का उपयोग करें। इसे तब तक चलाएं जब तक कोई प्रतिस्थापन नहीं किया जाता है। फिर कोणों को दोहराने और दोहराने के लिए स्विच करें।

7

विंडोज एपीआई में हमेशा निर्देशिका विभाजक के रूप में आगे स्लैश समर्थित है। और ऐसा इसलिए है क्योंकि कम से कम डॉस 3.1 के रूप में इसे भी समर्थित किया गया था। समस्या हमेशा COMMAND.COM और CMD.EXE रहा है। वे विकल्प संकेतक के रूप में आगे स्लैश का उपयोग करते हैं (यूनिक्स में पाए गए डैश के बजाय)। कभी भी उन भाषाओं में निर्देशिका विभाजक के लिए बैकस्लाश का उपयोग न करें जहां विशेष वर्णों से बचने के लिए स्ट्रिंग में बैकस्लैश का उपयोग किया जाता है।

यदि आपके पास यूनिक्स शैल की कमी है, तो क्या आपके पास कोई संपादक नहीं है जो एकाधिक फ़ाइलों में खोज/प्रतिस्थापित करता है? बिल्ली, अगर आपको करना है तो ऐसा करने के लिए एक छोटा सा प्रोग्राम लिखें। अपने # अंतर्निहित बयानों के लिए पार्सिंग सी ++ स्रोत कोड कठिन नहीं हो सकता है।

+1

यह हमेशा आगे स्लैश का समर्थन नहीं करता है जो उम्र के लिए एक बड़ी समस्या थी। लेकिन अब यह करता है। –

+2

कम से कम वापस डॉस 4.0 पर किया गया। – jmucchiello

+0

जो: निश्चित रूप से सच नहीं है। कंपाइलर्स ने इसे शामिल करने के लिए समर्थन किया हो सकता है, और एक्सप्लोरर यूआई निश्चित रूप से किया था। लेकिन सामान्य रूप से WinAPI नहीं था। –

10

आप लोग! हां, आप हमेशा आगे स्लेश का उपयोग कर सकते हैं, और चाहिए। मुझे लगता है कि समस्या से पर कैसे प्राप्त करें!

आप पर्ल स्थापित किया है, के बाद एक लाइनर, स्लैश आगे उपयोग करने के लिए एक सी ++ स्रोत फ़ाइल में परिवर्तित कर देंगे विस्तार .bak के साथ एक फ़ाइल में मूल संस्करण की बचत:

perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp 

(ऊपर कमांड लाइन के लिए है विंडोज़; यदि आप लिनक्स या अन्य यूनिक्स-जैसे खोल का उपयोग कर रहे हैं, तो डबल कोट्स के बजाय तीसरे पैरामीटर के आस-पास एकल कोट्स का उपयोग करें।)

आप फ़ाइलों को आप बदलने की आवश्यकता का एक समूह है, तो .cpp में समाप्त होने वाले सभी फाइलों को कहते हैं:

for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f 

एक बॉर्न शैल पर्यावरण के लिए इसी आदेश (विशिष्ट लिनक्स खोल):

for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done 

यदि आपके पास पर्ल इंस्टॉल नहीं है, तो आपको एक टेक्स्ट एडिटर ढूंढने में सक्षम होना चाहिए जो फ़ाइलों को खोज और प्रतिस्थापित करने की अनुमति देता है।

+1

आप एक अलग सेपरेटर का उपयोग करना चाह सकते हैं! यदि आप टीसीएसएच का उपयोग कर रहे हैं। –

+0

@ मिरी: अच्छा बिंदु। इसके अलावा आपको कुछ हद तक लूप के सिंटैक्स को बदलने की आवश्यकता होगी (दुर्भाग्य से मैं सटीक वाक्यविन्यास भूल जाता हूं)। –

+0

foreach f (* .cpp) .... अंत; मुझे नहीं लगता कि आप इसे एक लाइन पर कर सकते हैं ... –

0

आप पिछले पर्ल आदेश जो काम करते हैं recusrively

find . -type f -name \* | xargs grep '#include' | grep '\\' |awk -F: '{print $1}'|sort| uniq | xargs -n1 perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' 
संबंधित मुद्दे