2010-11-11 16 views
10

मैंने हाल ही में नवीनतम llvm और clang trunk संस्करणों को आजमाया। उन्होंने बॉक्स के बाहर एक चेतावनी के बिना संकलित किया लेकिन मुझे एक हैलो वर्ल्ड उदाहरण को जोड़ने में परेशानी हो रही है। मेरे कोडक्लैंग लिंकर समस्या

#include <stdio.h> 
int main(){ 
    printf("hello\n"); 
} 

मैं का उपयोग कर संकलन

clang test.c 

मैं -v का प्रयोग निम्न त्रुटि

/usr/bin/ld: crt1.o: No such file: No such file or directory 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

मिल पता चलता है कि gnu ld

"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out crt1.o crti.o crtbegin.o -L -L/../../.. /tmp/cc-0XJTsG.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed crtend.o crtn.o 
के रूप में लागू किया जाता है

लेकिन मेरे पास crt1.o ऑब्जेक्ट फ़ाइल है!

$ locate crt1.o 
/usr/lib/Mcrt1.o 
/usr/lib/Scrt1.o 
/usr/lib/crt1.o 
/usr/lib/gcrt1.o 

क्या भी काम करता है

clang -c test.c 
gcc test.o 

और पाठ्यक्रम

gcc test.c 

की है क्या मैं आगे की कोशिश की:

$ clang -Xlinker "-L /usr/lib" test.c 
/usr/bin/ld: crt1.o: No such file: No such file or directory 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
$ clang -Xlinker "-L /usr/lib" test.c -v 
"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out crt1.o crti.o crtbegin.o -L -L/../../.. -L /usr/lib /tmp/cc-YsI9ES.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed crtend.o 

मैं भी में crt1.o फ़ाइल कॉपी करने की कोशिश की वर्तमान निर्देशिका। यह काम करने लग रहा था। वैसे यह संकलित नहीं हुआ क्योंकि उस crti.o के बाद गायब था।

मेरा डिस्ट्रो उबंटू है।

अच्छी तरह से मुझे वास्तव में पता नहीं है कि आगे क्या प्रयास करना है। मैं नहीं देखता कि मैं क्लैंग को कैसे ठीक कर सकता हूं और न ही मुझे यह पता है कि एलडी आमंत्रण में आवश्यक पथ को कैसे इंजेक्ट करना है। कोई विचार? llvm›tools›clang›lib›Driver›Tools.cpp

CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 
    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 
    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 

और:

+0

मैं सिर्फ अपने बजना के पृष्ठ में -Xlinker का एक संक्षिप्त विवरण है, लेकिन माना जाता -Xlinker नहीं है तर्क के साथ विकल्प के लिए दो बार पारित किया? जीसीसी के मैन पेज -Xlinker के लिए यही कहते हैं। – anddam

उत्तर

3

बजना संस्करण है जो मेजबान के लिनक्स संस्करण और जीसीसी संस्करण का पता नहीं लगा सकते हैं .. जो CRT * करने के लिए पथ को जोड़ना होगा बजना में

इस कोड को होने के लिए लगता है GetFilePath वर्तमान टूलChain (फ़ाइल clang/lib/Driver/ToolChains.cpp) की getFilePaths() सूची में पूछे गए फ़ाइलों को खोजने का प्रयास करेगा। अगर यह फ़ाइल नहीं ढूंढ पाता है तो यह नाम अपरिवर्तित वापस कर देगा।

कृपया, मुझे अपने ubuntu के संस्करण (uname -a, cat /etc/lsb-release), बजना और LLVM की सटीक रिलीज (SVN संशोधन संख्या), और gcc -v उत्पादन

+2

उत्सुकता से उस फ़ंक्शन का अपूर्णता आपके द्वारा उद्धृत किए गए एक से अलग है ... हालांकि पथ.push_back ("/ usr/lib") जोड़ना; पथ.push_back ("/ usr/lib/gcc/i486-linux-gnu/4.4/"); चाल है यदि मैं कोड को सही तरीके से समझता हूं तो यह केवल/usr/lib में दिखता है जब/usr/lib64 मौजूद नहीं है। हालांकि यह निर्देशिका मेरे सिस्टम – Ben04

+0

पर मौजूद है, वहां एक बहुत पुराना उद्धरण था। अब मुझे http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ मिल गया है और क्लैंग रेव, उबंटू और जीसीसी संस्करण – osgx

+0

के आपके संयोजन के लिए कोड की जांच कर सकते हैं 'GetFilePath() 'trys का कोड 'getFilePaths()' सूची में प्रत्येक निर्देशिका में एक फ़ाइल (crt1.o) को खोलने के लिए। यदि फ़ाइल कहीं भी है या यह – osgx

1

इस भयानक हैक "फिक्स" संकलन/बजना 3.0 के साथ जोड़ने देना (r142716) उबंटू 11.10 (x86)

फ़ाइल में पर /usr/include/stdio.h:28 से शामिल हैं:
/usr/include/features.h:323:10: गंभीर त्रुटि: 'बिट्स/predefs। एच 'फ़ाइल नहीं मिली

/usr/bin/ld: crt1.o नहीं मिल सकता: ऐसा कोई नहीं फ़ाइल या निर्देशिका
/usr/bin/ld: crti नहीं मिल सकता है।ओ: ऐसा कोई फ़ाइल या निर्देशिका

diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp 
index 75300b5..3e2be30 100644 
--- a/lib/Driver/Driver.cpp 
+++ b/lib/Driver/Driver.cpp 
@@ -241,6 +241,7 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { 
    // FIXME: Handle environment options which affect driver behavior, somewhere 
    // (client?). GCC_EXEC_PREFIX, LIBRARY_PATH, LPATH, CC_PRINT_OPTIONS. 

+ PrefixDirs.push_back("/usr/lib/i386-linux-gnu"); 
    if (char *env = ::getenv("COMPILER_PATH")) { 
    StringRef CompilerPath = env; 
    while (!CompilerPath.empty()) { 
diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp 
index b066e71..c6ffee8 100644 
--- a/lib/Frontend/InitHeaderSearch.cpp 
+++ b/lib/Frontend/InitHeaderSearch.cpp 
@@ -562,10 +562,12 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, 
     AddPath("/usr/include/x86_64-linux-gnu", System, false, false, false); 
     AddPath("/usr/include/i686-linux-gnu/64", System, false, false, false); 
     AddPath("/usr/include/i486-linux-gnu/64", System, false, false, false); 
+  AddPath("/usr/include/i386-linux-gnu/64", System, false, false, false); 
    } else if (triple.getArch() == llvm::Triple::x86) { 
     AddPath("/usr/include/x86_64-linux-gnu/32", System, false, false, false); 
     AddPath("/usr/include/i686-linux-gnu", System, false, false, false); 
     AddPath("/usr/include/i486-linux-gnu", System, false, false, false); 
+  AddPath("/usr/include/i386-linux-gnu", System, false, false, false); 
    } else if (triple.getArch() == llvm::Triple::arm) { 
     AddPath("/usr/include/arm-linux-gnueabi", System, false, false, false); 
    } 
+1

r143344, r143345, r143346 के बाद से यह पैच अब आवश्यक नहीं है। समस्या अब तय की जानी चाहिए। देखें http://llvm.org/bugs/show_bug.cgi?id=11223 – Peter

0

रन:

clang -v 

मेरी उदाहरण उत्पादन में है:

clang version 3.0 (tags/RELEASE_30/final) 
Target: armv7l-unknown-linux-gnueabi 
Thread model: posix 

के रूप में याद आ रही निर्देशिका बनाने के लिए लक्ष्य का उपयोग करने के रूट के रूप में निम्नलिखित भागो एक लिंक:

ln -s /lib/arm-linux-gnueabi /lib/armv7l-unknown-linux-gnueabi 
ln -s /usr/lib/arm-linux-gnueabi /usr/lib/armv7l-unknown-linux-gnueabi 
ldconfig 
1

सबसे हालिया (3.5) रिलीज पर इस प्रकार की समस्या फिर से बढ़ी है जो --with-gcc-toolchain प्री-जीसीसी 4.7 libstdC++ लाइब्रेरी के साथ सिस्टम पर कॉन्फ़िगरेशन विकल्प का उपयोग करके निर्माण करता है।

आप दो जायके में यह देखेंगे:

echo '#include <string>' | clang++ -xc++ - 
<stdin>:1:10: fatal error: 'string' file not found 
#include <string> 
     ^
1 error generated. 

... के साथ-साथ नहीं के बारे में विभिन्न CRT फ़ाइलों को खोजने के लिए किया जा रहा है।

दोनों मामलों में, निम्नलिखित आप समस्या को हल करने के लिए जब तक यह तय हो जाता है की अनुमति देता है:

printf '#include <string>\nint main(int argc, char *argv[]) { return 0; }' > /tmp/blah.cc 
# Fixes issue not finding C++ headers; note that it must be gcc >= 4.7 
clang++ --gcc-toolchain=/path/to/gcc/install -c -o /tmp/blah.o /tmp/blah.cc 
# Fixes the link error 
clang++ --gcc-toolchain=/path/to/gcc/install /tmp/blah.o /tmp/blah 
संबंधित मुद्दे