2012-04-23 21 views
11

का उपयोग करते समय एलएलवीएम लिंकर का उपयोग करना सीएमके को जीएनयू ld के बजाय एलएलवीएम लिंकर llvm-link का उपयोग करने के लिए सबसे अच्छा तरीका क्या है? जबक्लैंग और सीएमके

CXX=clang++ cmake <args> 

के साथ एक परियोजना को विन्यस्त डिफ़ॉल्ट लिंकर, अछूता हो गया लगता है शेष usr/bin/ld (लिनक्स पर)।

क्या यह using a separate toolchain file के बिना संभव है?

+0

https://stackoverflow.com/a/25274328/69663 संबंधित – unhammer

उत्तर

11

यह सीएमके से संबंधित नहीं है: clang++ डिफ़ॉल्ट रूप से सिस्टम लिंकर का उपयोग करता है। उदाहरण के लिए,

echo "#include <atomic>\n int main() { return 0; }" \ 
    | clang++ -x c++ -std=c++11 -stdlib=libc++ - 

एप्लिकेशन को लिंक करने के लिए /usr/bin/ld का उपयोग करता है। llvm-link को लिंकर बदलने के लिए, एक पहले, उदा LLVM बाइट कोड फेंकना, और फिर लिंकर फोन .:

echo "#include <atomic>\n int main() { return 0; }" \ 
    | clang++ -x c++ -std=c++11 -stdlib=libc++ -S -emit-llvm -o - - \ 
    | llvm-link -o binary - 

यह नजरअंदाज /usr/bin/ld की जरूरत है।

+4

से संबंधित लगता है और यह cmake के साथ कैसे किया जा सकता है? –

+0

जब आप कहते हैं कि 'सिस्टम लिंकर' क्या आपका मतलब है कि वह आपके '$ पाथ' में पहले पाता है, या यह '/ usr/bin/'में किसी का उपयोग करने के लिए क्लैंग में हार्डकोड किया गया है? – Ephemera

+0

क्लैंग लिंकर खोज पथ, AFAIK हार्डकोड करता है, और आपके '$ पाथ 'के अलावा अन्य स्थानों में' ld' बाइनरी लेने का प्रयास करता है। मैंने एलएलवीएम बाइट कोड लिंकर के विरोध में देशी ऑब्जेक्ट कोड के मानक लिंकर को संदर्भित करने के लिए "सिस्टम लिंकर" कहा। – mavam

5

3.4 के रूप में, clang पहले यह ld रास्ते पर के लिए लग रहा है GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin" पर लिंकर (ld) के लिए लग रहा है। आपको अपने लिंकर को /usr/lib/gcc/<arch><sub>-<vendor>-<sys>-<abi>/<version>/ld में डालने में सक्षम होना चाहिए और इसे 1 चरण में clang द्वारा कॉल किया जाना चाहिए। मैन्युअल रूप से इस स्थान को निर्दिष्ट करने के लिए, अनूदित-B ध्वज का उपयोग करें। दुर्भाग्यवश, मुझे विश्वास नहीं है कि लिंकर के नाम को बदलने का एक तरीका है जिसे खोजा गया है ताकि ld.gold या lld का उपयोग करके उपर्युक्त स्थान पर एक सिम्लिंक की आवश्यकता हो।