पर ठीक से काम नहीं करता है, मैं झुकाव के लिए एक नवागंतुक हूं, इसलिए शायद मैं कुछ मूर्खतापूर्ण कर रहा हूं। लेकिन मैंने यहां खोज सहित कई घंटों तक समाधान की तलाश की है, जहां मुझे डिस्ट्रो-प्रदत्त पैकेजों के साथ-साथ प्रश्नों को संबोधित करने के लिए प्रश्न नहीं मिला है। इस विवरण का विवरण फेडोरा 18 के लिए विशिष्ट है, लेकिन मुझे उबंटू 13.04 पर समान समस्याएं आ रही हैं, इसलिए समस्या फेडोरा के लिए विशिष्ट नहीं है। यह या तो मुझे या झुकाव है।क्लैंग लिंक-टाइम ऑप्टिमाइज़ेशन फेडोरा 18
समस्या: मैं लिंक-टाइम-ऑप्टिमाइज़ेशन के लाभ प्राप्त करने के लिए clang++ -flto
का उपयोग करके एक सरल हैलो-वर्ल्ड प्रोग्राम संकलित करने का प्रयास कर रहा हूं। बिना -फ्लो यह ठीक काम करता है। इसके साथ-साथ यह लिंक करने में विफल रहता है। clang -flto -o hello hello.o -v
के रूप में लागू पूर्ण लिंकर कमांड लाइन को देखने के लिए, मैं मिलता है:
$ clang++ -flto -o hello hello.o -v
clang version 3.2 (tags/RELEASE_32/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../.. -L/lib -L/usr/lib -plugin /usr/bin/../lib/LLVMgold.so hello.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crtn.o
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error loading plugin
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error in plugin cleanup (ignored)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
वहाँ दो समस्याओं होने लगते हैं:
बजना ++
/usr/bin/ld
के रूप में लिंकर invokes, और कहा कि सोने लिंकर नहीं है। Fedora18/usr/bin/ld.gold
के रूप में सोना स्थापित करता है। मैंने/usr/local/bin/ld
से/usr/bin/ld.gold
से एक सिम्लिंक बनाने का प्रयास किया है, सत्यापित किया है किwhich ld
/usr/local/bin/ld
कहता है, लेकिन क्लैंग ++ इसका उपयोग नहीं करता है। ऐसा लगता है कि/usr/bin/ld के लिए कड़ी मेहनत की जा रही है।क्लैंग ++ ने
-plugin /usr/bin/../lib/LLVMgold.so
के साथ लिंकर को बुलाया। यह गलत है, क्योंकि क्लैंग का फेडोरा वितरण/usr/lib64/llvm/LLVMgold.so
पर रखता है।
मैं मैन्युअल रूप से निम्नलिखित में तोड़ मरोड़ के साथ ऊपर है कि लिंकर लाइन लागू की कोशिश की है:
-plugin /usr/lib64/llvm/LLVMgold.so
साथ-plugin /usr/bin/../lib/LLVMgold.so
बदलें। यह त्रुटि संदेशhello.o: file not recognized: File format not recognized
उत्पन्न करता है। इसलिए गैर-सोने के लिंकर को प्लगइन के बारे में पता चल रहा है लेकिन .o के पास नहीं है जिसमें एलएलवीएम बिटकोड है।/usr/bin/ld
/usr/bin/ld.gold
के साथ बदलें। यह काम करता है, एक निष्पादन योग्य उत्पन्न करता है जो अपेक्षित के रूप में चलता है।उपरोक्त दोनों
-plugin
के बजाय--plugin
के साथ। इस बदलाव से कोई फर्क नहीं पड़ता।
तो किसी ऐसे व्यक्ति के लिए सबसे अच्छा तरीका क्या है जो क्लैंग -फ्लो का उपयोग करने के लिए सिस्टम-प्रदत्त पैकेजों से चिपकना पसंद करता है? मुझे उम्मीद है कि एक कॉन्फ़िगरेशन फ़ाइल है, या अनियंत्रित विकल्प या पर्यावरण चर है जो मुझे इन्हें ओवरराइड करने देगा। या बेहतर, कि मुझे एक पैकेज याद आ रहा है और "यम इंस्टॉल ..." इसे ठीक कर देगा।
मैं सीधे लिंकर का आह्वान नहीं करना चाहूंगा, क्योंकि मेरे मेकफ़ाइल को सिस्टम ऑब्जेक्ट्स और पुस्तकालयों को जानने की आवश्यकता है कि उन्हें अनजान होना चाहिए (उदा। Crt1.o, crtbegin.o, crtend.o)। मैं खुद को क्लैंग भी बना सकता हूं, लेकिन मैं इसकी कॉन्फ़िगरेशन स्क्रिप्ट में कुछ भी नहीं देख रहा हूं जो मुझे लिंकर और प्लगइन के पथ को कॉन्फ़िगर करने देता है।
मैं फेडोरा 18. कंप्यूटर पर केवल गैर distro संकुल चल रहा हूँ गूगल क्रोम और VMware उपकरण (यह VMWare संलयन के अंदर एक अतिथि है) कर रहे हैं।प्रासंगिक फेडोरा संकुल के संस्करण (पूरे कंप्यूटर आज के रूप में "यम अद्यतन" है, 29-अप्रैल 2013):
$ yum list --noplugins installed binutils* clang* llvm* gcc*
Installed Packages
binutils.x86_64 2.23.51.0.1-6.fc18 @updates
binutils-devel.x86_64 2.23.51.0.1-6.fc18 @updates
clang.x86_64 3.2-2.fc18 @updates
clang-devel.x86_64 3.2-2.fc18 @updates
clang-doc.noarch 3.2-2.fc18 @updates
gcc.x86_64 4.7.2-8.fc18 @fedora
gcc-c++.x86_64 4.7.2-8.fc18 @fedora
llvm.x86_64 3.2-2.fc18 @updates
llvm-libs.x86_64 3.2-2.fc18 @updates
बस कुछ समय बचाने के लिए, जैसा कि आप देख सकते हैं, यह 'lib' में देख रहा है, न कि 'lib64'। मेरे लिए काम करने वाला सिम्लिंक 'sudo ln -s /usr/lib64/llvm/LLVMgold.so/usr/lib/LLVMgold.so' था। – Jerska