2011-08-30 8 views
24

विंडोज़ पर, मैं कोडसोर्सरी के क्रॉस-कंपाइलर सूट का उपयोग करके एआरएम/लिनक्स के लिए एक प्रोग्राम को क्रॉस-कंपाइल कर रहा हूं। मैं अपने कमांड दुभाषिया के रूप में mingw msys का उपयोग करता हूं, और अक्सर यह मेरे पथ और पथनामों को जोड़ देगा। उदाहरण के लिए, मेरे कार्यक्रम का निर्माण करने, मैंकमांड लाइन पर दिए गए पथ नामों से mingw और msys को कैसे रोकें?

arm-none-linux-gnueabi-gcc.exe -Wall -g \ 
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \ 
    -Wl,-rpath=/usr/lib/myrpath \ 
    -I../targetsysroot/usr/include \ 
    myprogram.c -o myprogram 

आह्वान बेशक, मैं /usr/lib/myrpathmyprogram निष्पादन में शब्दशः डाला चाहते हैं - एआरएम linux लक्ष्य मैं MinGW या msys उपयोग नहीं करता है के लिए संकलन कर रहा हूँ। लेकिन यहाँ यह में जाने क्या हो रहा समाप्त होता है:

... 
0x0000000f (RPATH)   Library rpath: [C:/MinGW/msys/1.0/lib/myrpath] 
... 

मैं नहीं वास्तव में क्या करना चाहता था। अगर मैं cmd.exe कमांड लाइन पर सीधे gcc का आह्वान करता हूं, तो मुझे निष्पादन योग्य में सही rpath मिलता है। अगर मैं msys कमांड लाइन पर gcc का आह्वान करता हूं, तो मुझे उलझा हुआ रैपथ मिलता है। अगर मैं cmd.exe कमांड लाइन से बनाने के साथ चलाए गए मेकफ़ाइल के साथ जीसीसी का आह्वान करता हूं, तो मुझे अभी भी एक उलझन में rpath (!)

कोई विचार है कि मैं इस कष्टप्रद व्यवहार को कैसे बंद कर सकता हूं?

उत्तर

5

मुझे नहीं लगता कि इसे बंद करने का कोई तरीका है। एमएसवाईएस एक पुराने सिग्विन संस्करण का एक कांटा है जिसमें विंडोज़ एकीकरण में सुधार के उद्देश्य से कई बदलाव किए गए हैं, जिससे देशी विंडोज प्रोग्राम का आह्वान करते समय स्वत: पॉज़िक्स पथ अनुवाद तर्कसंगत रूप से सबसे महत्वपूर्ण है। इसके साथ समस्या यह है कि यह कहना हमेशा संभव नहीं है कि कोई तर्क एक पथ है या कुछ और, यानी, इस मामले में, वास्तव में यह एक पथ है जिसका अनुवाद नहीं किया जाना चाहिए। अनुवाद set of heuristics द्वारा निर्देशित है।

आप एमएसवाईएस बनाने के बजाय मिनजीडब्ल्यू मेक का उपयोग करने का प्रयास कर सकते हैं (हाँ, वे अलग-अलग चीजें हैं), जो पॉज़िक्स पथ समर्थन और रूपांतरण के बिना मूल विंडोज बिल्ड बनाने का है। mingw-get install mingw32-make के साथ स्थापित करें और mingw32-make के रूप में आमंत्रित करें।

या आप सिग्विन को टूलचैन के सिग्विन निर्माण के साथ आदर्श रूप से आजमा सकते हैं।

+0

धन्यवाद - कि लिंक (heuristics) 'बाहर नकली' MinGW करने के लिए मुझे मदद की है और अनमोल के माध्यम से अपना रास्ता प्राप्त करें। –

+2

गलत! बंद होने पर स्विच करने का एक तरीका है। http://stackoverflow.com/a/34386471/404615 –

16

मैंने अभी MSSS/MinGW से आपके लिए पथों का अनुवाद करने से बचने के लिए एक साफ चाल खोज ली है।

यदि आप पथ शुरू करने के लिए डबल-स्लैश का उपयोग करते हैं, तो MSYS पथ को डॉस प्रारूप में अनुवाद नहीं करेगा। तो ओपी के उदाहरण में, -rpath स्विच इस तरह निर्दिष्ट किया जाना चाहिए:

-Wl,-rpath=//usr/lib/myrpath

सभी यूनिक्स/लिनक्स उपकरण किसी भी समस्या के बिना इस तरह के नकली स्लैश संभाल करने लगते हैं, तो भले ही अपने द्विआधारी के rpath // के साथ शुरू होगा usr/... मुझे लगता है कि लोडर सही काम करेगा।

+6

यह मेरे लिए काम नहीं करता है लेकिन -rpath = "// usr \ lib \ myrpath" करता है (पथ के लिए उद्धरण और बैकस्लैश के साथ) –

+0

मीठे! यह चाल पूरी तरह से मेरे लिए काम किया। धन्यवाद! – BrandonLWhite

+0

यह एक काम करता है, http://stackoverflow.com/a/34386471/404615 –

0

दुर्भाग्य से इस उदाहरण के लिए दो आगे की स्लैश डालने की उम्मीद के अनुसार काम नहीं करता है।

rsync -rvztn --delete --exclude="/application/logs/" ...

मैं 'rsync' केवल आवेदन पर/फ़ाइलें बाहर करने के लिए/लॉग जो शीर्ष स्तर पर है, इसलिए आगे अग्रणी स्लेश चाहते हैं। दो फॉरवर्ड स्लैश जोड़ने से यह इस निर्देशिका को बाहर नहीं कर पाएगा। मुझे कम सटीक --exclude="application/logs/" का सहारा लेना है।

+0

देखें http://stackoverflow.com/a/34386471/404615 –

36

वहाँ is a wayMSYS2 में Windows Git MSys में MSYS_NO_PATHCONV=1 या MSYS2_ARG_CONV_EXCL="*" की स्थापना करके पथ अनुवाद को दबाने के लिए।

वैकल्पिक रूप से, आप चर केवल अस्थायी रूप से सिर्फ इतना है कि आदेश के लिए सिर्फ आदेश ही से पहले काम रखकर सेट कर सकते हैं:

MSYS_NO_PATHCONV=1 arm-none-linux-gnueabi-gcc.exe -Wall -g \ 
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \ 
    -Wl,-rpath=/usr/lib/myrpath \ 
    -I../targetsysroot/usr/include \ 
    myprogram.c -o myprogram 
+8

यह गलत है। यह [केवल एमएसवाईएस रनटाइम के विंडो के फोर्क के लिए गिट में जोड़ा गया था] (https://github.com/git-for-windows/msys2-runtime/pull/11) और 'MSYS_NO_PATHCONV' चर ** ** पहचान नहीं है एमएसवाईएस के अपस्ट्रीम संस्करण द्वारा: 1.0 नहीं, MSYS2 नहीं, 32 नहीं और न ही 64 बिट संस्करण। –

+0

यह बहुत बढ़िया है। काश यह हमेशा उपलब्ध था। इस पर ध्यान दिलाने के लिए धन्यवाद। – xer0x

+0

'MSYS2_ARG_CONV_EXC =" * "' अपस्ट्रीम MSYS2 द्वारा स्वीकार किया जाता है और वही करता है। यह दस्तावेज है https://sourceforge.net/p/msys2/wiki/Porting/ यहां – Phyx

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