gcc - कमांड लाइन में दिए गए पथ के नामों से MinGW और MSYS को कैसे रोकें




cross-compiling rpath (3)

विंडोज पर, मैं कोडसॉररी के क्रॉस-कंपाइलर सूट का उपयोग करके एआरएम / लिनक्स के लिए एक कार्यक्रम का संकलन कर रहा हूं। मैं अपने कमांड दुभाषिया के रूप में मिनगॉव 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/myrpath ने myprogram निष्पादन योग्य में शब्दशः सम्मिलित किया है - मैं जिस एआरएम लिनक्स लक्ष्य का संकलन कर रहा हूं वह मिनगीड या एमएसवाईएस का उपयोग नहीं करता है। लेकिन यहाँ क्या यह में जा रहा समाप्त होता है:

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

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

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


Windows Git MSys या MSYS2_ARG_CONV_EXCL="*" में MSYS_NO_PATHCONV=1 सेट करके पथ अनुवाद को दबाने का एक तरीका है।

वैकल्पिक रूप से, आप केवल उस कमांड के लिए अस्थायी रूप से केवल कमांड के पहले ही असाइनमेंट डालकर सेट कर सकते हैं:

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

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

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

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


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

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

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

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