clang linker problem

前端 未结 4 751
北荒
北荒 2021-01-04 20:18

I just tried out the latest llvm and clang trunk versions. They compiled without a single warning out of the box but I\'m having trouble linking a hello world example. My Co

相关标签:
4条回答
  • 2021-01-04 21:04

    run:

    clang -v
    

    In my example output is:

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

    Run the following as root to use the target to create missing directory as a link:

    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
    
    0 讨论(0)
  • 2021-01-04 21:10

    On the most recent (3.5) release this sort of problem has cropped up again for anyone who does a build using the --with-gcc-toolchain configure option on a system with a pre-gcc 4.7 libstdc++ library installed.

    You'll see it in two flavors:

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

    ... as well as not being about to find the various crt files.

    In both cases, the following allows you to work around the problem until it gets fixed:

    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
    
    0 讨论(0)
  • 2021-01-04 21:20

    Seems to be clang version which can't detect host's linux version and gcc version..

    This code in clang which must add path to the crt*: 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")));
    

    and the GetFilePath will try to search asked files in getFilePaths() list of current ToolChain (file clang/lib/Driver/ToolChains.cpp). If it can't find a file it will return the Name unchanged.

    Please, give me version of your ubuntu (uname -a, cat /etc/lsb-release), exact release (svn revision number) of clang and llvm, and gcc -v output

    0 讨论(0)
  • 2021-01-04 21:21

    This horrible HACK "fixes" compiling/linking with clang 3.0(r142716) on Ubuntu 11.10 (x86)

    In file included from /usr/include/stdio.h:28:
    /usr/include/features.h:323:10: fatal error: 'bits/predefs.h' file not found

    /usr/bin/ld: cannot find crt1.o: No such file or directory
    /usr/bin/ld: cannot find crti.o: No such file or directory

    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);
         }
    
    0 讨论(0)
提交回复
热议问题