मुझे समझ में नहीं आता -Wl, -rpath -Wl,


244

सुविधा के लिए मैंने नीचे संबंधित मानपत्र जोड़े।

मेरी (गलत) समझ पहले: अगर मुझे इसके साथ विकल्पों को अलग करने की आवश्यकता है ,, तो इसका मतलब है कि दूसरा -Wlविकल्प नहीं है क्योंकि यह पहले आता है ,जिसका अर्थ है कि यह -rpathविकल्प के लिए एक तर्क है ।

मुझे समझ में नहीं आता कि कैसे -rpathएक -Wl,.तर्क हो सकता है !

मेरे मन में क्या समझ में आता है:

-Wl,-rpath .

यह वर्तमान निर्देशिका तर्क के साथ -रथ लिंकर विकल्प को लागू करना चाहिए।


आदमी gcc:

-Wl, विकल्प

लिंकर के विकल्प के रूप में पास विकल्प। यदि विकल्प में अल्पविराम होता है, तो यह अल्पविराम में कई विकल्पों में विभाजित होता है। आप इस सिंटैक्स का उपयोग विकल्प में तर्क पास करने के लिए कर सकते हैं। उदाहरण के लिए, लिंकर को -Wl,-Map,output.mapपास -Map output.mapकरता है। जीएनयू लिंकर का उपयोग करते समय, आप `-वेल, -रूप = आउटपुट.मैप 'के साथ भी समान प्रभाव प्राप्त कर सकते हैं।

आदमी ld:

-rpath = dir

रनटाइम लाइब्रेरी खोज पथ के लिए एक निर्देशिका जोड़ें। यह साझा वस्तुओं के साथ एक ईएलएफ निष्पादन योग्य को जोड़ने पर उपयोग किया जाता है। ऑल -rp तर्क को संक्षिप्त किया जाता है और रनटाइम लिंकर को पास किया जाता है, जो रनटाइम पर साझा किए गए ऑब्जेक्ट का पता लगाने के लिए उनका उपयोग करता है। -Rpath विकल्प का उपयोग तब भी किया जाता है जब साझा किए गए ऑब्जेक्ट को लिंक में स्पष्ट रूप से शामिल किए गए साझा ऑब्जेक्ट की आवश्यकता होती है;


2
क्या शीर्षक अंत में गायब नहीं है?
Celdor

जवाबों:


277

-Wl,xxxके लिए विकल्प जीसीसी पर तर्कों की एक अंतरिक्ष अलग की गई सूची के रूप में टोकन के एक अल्पविराम से अलग किए गुजरता लिंकर । इसलिए

gcc -Wl,aaa,bbb,ccc

अंततः एक लिंकर कॉल बन जाता है

ld aaa bbb ccc

आपके मामले में, आप " ld -rpath ." कहना चाहते हैं , इसलिए आप इसे -Wl,-rpath,.वैकल्पिक रूप से gcc में पास करते हैं , आप निम्न उदाहरणों को निर्दिष्ट कर सकते हैं -Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc

ध्यान दें कि aaaदूसरा और बीच कोई अल्पविराम नहीं है -Wl

या, अपने मामले में -Wl,-rpath -Wl,.


5
ओह, अब मैं समझता हूं कि लिंकर को सामान पास करते समय विकल्प या तर्क के बीच कोई भेदभाव नहीं है, यह सिर्फ एक स्ट्रिंग है। तो दूसरा -Wl बेमानी है! धन्यवाद :)
ब्लब

29
@ ब्लूब: यह बेमानी नहीं है! यह एक वैकल्पिक रूप है, आप या तो कहते हैं -Wl,-rpath,. या आप कहते हैं -Wl,-rpath -Wl,.। संभवतः दोनों में से एक, आप कुछ भी छोड़ नहीं सकते।
केरेक एसबी

क्या किसी को OS X पर clath और ld64 के साथ rpath सेट करने में सफलता मिली है?
बेन-अल्ब्रेच

यदि आप कई rpaths निर्दिष्ट करना चाहते हैं तो सिंटैक्स कैसा दिखेगा? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
हिंट्रोन

1
@ हिंट्रोन: हाँ, या -Wl,-rpath,dir1,-rpath,dir2, या -Wl,-rpath=dir1,-rpath=dir2
केरेक एसबी

63

आप भी लिख सकते हैं

-Wl,-rpath=.

उस pesky अंतरिक्ष से छुटकारा पाने के लिए। यह अतिरिक्त कॉमा को जोड़ने की तुलना में यकीनन अधिक पठनीय है (यह वही है जो ld में पास हो जाता है)।


3
से gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options के तहत -Wl,option: " जीएनयू लिंकर का उपयोग करते समय ।, आप भी -Wl, -Map = output.map साथ एक ही प्रभाव प्राप्त कर सकते हैं" मेरे लिए, यह इंगित करता है कि यदि आप GNU लिंकर के अलावा एक लिंकर का उपयोग करते हैं, तो =सिंटैक्स का समर्थन नहीं किया जा सकता है।
हिंट्रोन

39

एक बात और। आपको -L विकल्प को भी निर्दिष्ट करना पड़ सकता है - जैसे

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz

या आप किसी त्रुटि के साथ समाप्त हो सकते हैं

ld: cannot find -lbaz

10

मैन पेज इसे काफी स्पष्ट करता है। यदि आप लिंक करने वाले को दो तर्क ( -rpathऔर .) पास करना चाहते हैं तो आप लिख सकते हैं

-Wl,-rpath,.

या वैकल्पिक रूप से

-Wl,-rpath -Wl,.

-Wl,-rpath .आपके द्वारा सुझाए गए तर्क मेरे मन का कोई मतलब नहीं है। जीसीसी को यह कैसे पता चलता है कि आपके दूसरे तर्क ( .) को सामान्य रूप से व्याख्या किए जाने के बजाय लिंकर को पारित किया जाना चाहिए? एकमात्र तरीका यह जानने में सक्षम होगा कि क्या यह सभी संभव लिंकर तर्कों का अंदरूनी ज्ञान है, इसलिए यह जानता था कि इसके -rpathलिए एक तर्क की आवश्यकता है।


यह अकल्पनीय नहीं है कि जीसीसी तर्कों का विश्लेषण करता है और अगर कुछ समझ में नहीं आता है, तो यह स्वचालित रूप से समूह बनाता है।
ब्लूब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.