2016-03-03 8 views
6

में उपयोग की जाने वाली एक लाइब्रेरी के लिए आरपीएथ सेट न करें मैं अपनी सीएमकेलिस्ट फाइल को कॉन्फ़िगर करना चाहता हूं ताकि मेरी प्रोजेक्ट बनाने के दौरान लिंकर एक साझा लाइब्रेरी (.so) की एक प्रति का उपयोग करता है जो रहता है मेरे निर्माण पेड़ में निष्पादन योग्य को जोड़ने के लिए लेकिन फिर लिंक किए गए निष्पादन योग्य में rpath सेट नहीं करता है ताकि लोडर अनुरोध करने पर सिस्टम को लाइब्रेरी प्रदान करनी चाहिए।सीएमके: लिंक

विशेष रूप से, मैं बिल्ड बिल्ड पर निर्माण समय के दौरान libOpenCL.so के खिलाफ लिंक करना चाहता हूं जिसमें libOpenCL.so सिस्टम लाइब्रेरी के रूप में स्थापित नहीं है। ऐसा करने के लिए, libOpenCL.so परियोजना निर्माण पेड़ में है और सीएमकेलिस्ट सूची में एक पूर्ण पथ का उपयोग करके संदर्भित है। यह पूर्ण पथ यह सुनिश्चित करना है कि यदि सिस्टम libOpenCL.so स्थापित होता है तो इसका उपयोग नहीं किया जाता है।

हालांकि, अंतिम निष्पादन योग्य चलाने पर, सीएमके ने आरपीएथ के लिए पूर्ण पथ जोड़ा है जो लाइब्रेरी लोडर द्वारा उठाए गए libOpenCL.so के सिस्टम संस्करण को रोकता है और उपयोग किया जाता है।

सरल लगता है लेकिन मैं इसे काफी समझ नहीं सकता।

धन्यवाद!

+2

आप सीएमएके को स्वत: उत्पन्न करने की बजाय आरपीएटीएच सेटिंग्स के लिए पूर्ण नियंत्रण ले सकते हैं। विकी के बारे में विकी देखें [सीएमके में आरपीएटीएच को सौंपना] (https://cmake.org/Wiki/CMake_RPATH_handling)। – Tsyvarev

उत्तर

0

CMake Wiki के अनुसार यह एक समस्या नहीं होनी चाहिए:

डिफ़ॉल्ट अगर आप किसी भी RPATH संबंधित सेटिंग में बदलाव नहीं करते हैं, CMake में सभी का इस्तेमाल किया पुस्तकालयों के लिए पूर्ण RPATH साथ निष्पादनयोग्य और साझा पुस्तकालयों लिंक करेगा तक निर्माण पेड़ इंस्टॉल करते समय, यह इन लक्ष्यों के RPATH को साफ़ कर देगा ताकि वे एक खाली RPATH के साथ स्थापित हो जाएं।

तो आप इसे इंस्टॉल करने का प्रयास कर सकते हैं?

+0

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

+0

@ user2746401 तो अंतिम बाइनरी को कहीं और स्थानांतरित करने के बिना "जगह में" संकलित कर रहे हैं? भले ही आप अपनी सभी बाइनरी के आरपीएथ को पट्टी कर दें, "अस्थायी" ओपनसीएल lib अभी भी लिंकर के लिए सबसे अच्छा मैच होगा, है ना? – ToniBig

+0

@ToniBig मैं जगह पर निर्माण कर रहा हूं। अगर मैं आरपीएथ को तोड़ता हूं तो लाइब्रेरी लोडर मेरी कस्टम लाइब्रेरी को बिल्कुल नहीं ढूंढ पाएगा इसलिए लोडर को "अस्थायी" ओपनसीएल लाइब्रेरी नहीं मिलेगी। ध्यान दें कि यह एक लिंकर कॉन्फ़िगरेशन प्रश्न के बजाय लाइब्रेरी लोडर प्रश्न है। – user2746401