【问题标题】:Clang++ --gcc-toolchain and gcc 4.9.3 linking issuesClang++ --gcc-toolchain 和 gcc 4.9.3 链接问题
【发布时间】:2016-08-30 03:31:25
【问题描述】:

(Ubuntu 16.04.1)

默认情况下,16.04.1 clang 为 5.4 选择 gcc 工具链。不幸的是,我有一个库需要 pre-5.0 ABI 并且我无法访问源代码,实施者也没有发布新版本。我一直在尝试使用 --gcc-toolchain 选项,但我无法让它工作。 (ctrbegin.o 和 crtend.o 在链接处没有得到正确的前缀。)

$ clang++-3.8 -v -print-search-dirs

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/5.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/6.0.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.0.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.4.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6.0.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.4.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.0.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../x86_64-linux-gnu/bin

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu:
/lib/x86_64-linux-gnu:
/lib/../lib64:
/usr/lib/x86_64-linux-gnu:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../..:
/usr/lib/llvm-3.8/bin/../lib:
/lib:
/usr/lib

当我尝试指定 --gcc-toolchain 时,clang 似乎接受,然后完全忽略该值。 (16.04.1 上的 clang++-3.5 也会发生同样的事情。)

这是正确的语法吗?请注意输出中缺少库目录。

$ clang++-3.8 -v --gcc-toolchain=/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3 -print-search-dirs

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/..//bin

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/usr/lib/llvm-3.8/bin/../lib:/lib:/usr/lib

我已经尝试了上述主题的许多变体。 (4.9,删除相对路径等)我尝试了 -isystem 选项和 -cxx-isystem 选项。 (两者都建议作为类似问题的解决方案。)

我错过了什么?(我希望它很简单,并且按顺序敲打头!)

【问题讨论】:

  • 您找到解决方案了吗?我也在处理一个非常相似的问题。
  • 我必须让事情快速运行,所以我提交了 clang,直到我们可以在同一个 ABI 下获得所有项目。在我有机会再次处理工具链问题之前,我暂时恢复使用 GCC。

标签: llvm clang++ gcc4.9


【解决方案1】:

您似乎传递了错误的路径到 --gcc-toolchain 选项。它期望 GCC 安装前缀的路径为 /usr,以防 GCC 与包管理器一起安装。但是,如果您的系统中安装了多个版本的 GCC 并且它们都具有相同的前缀,我认为不可能选择要使用的工具链。似乎clang只是在$PREFIX/lib/gcc/x86_64-linux-gnu目录中获取最新版本。因此,我建议您自己构建所需的工具链并将安装前缀传递给--gcc-toolchain 选项。

【讨论】:

  • 非常感谢,只是花了几个小时试图解决这个问题。现在这比以前更成问题,因为旧版本的Clang 不会链接到新版本的gcc,如果安装了新版本的gcc,最终会破坏clang 构建.如果没有这样的答案,几乎不可能得出解决方法。
【解决方案2】:

不幸的是,我有一个需要 5.0 之前的 ABI 的库,但我无权访问源代码

您无需切换 gcc-toolchain 即可更改 ABI,因为较新的 gcc 版本支持 dual-abi

要切换覆盖预处理器宏的 ABI:

clang++ -D_GLIBCXX_USE_CXX11_ABI=0 

因此,我建议您自己构建所需的工具链,并将安装前缀传递给 --gcc-toolchain 选项。

如果它已经可用,您可能希望通过符号链接模仿您的 /usr 文件夹来欺骗 clang 使用您选择的工具链,同时排除您不需要的 gcc 版本。

【讨论】:

    【解决方案3】:

    正如 Gaetano 在链接的票证中所写,您需要构建一个单独的目录,该目录可以作为 --gcc-toolchain 传递给 clang。这是我稍微完善的代码。不需要bininclude 链接。

    # The libstdc++ version you want to use
    libstdcxx_version="4.9"
    # Avoid calling arch twice
    arch="$(arch)"
    # The new toolchain root in the current directory
    toolchain_root="$(pwd)/toolchain"
    # The gcc library directory to be created
    toolchain_gcc="$toolchain_root/lib/gcc/$arch-linux-gnu"
    # Create that directory
    mkdir -p "$toolchain_gcc"
    # Find the longest matching libstdc++ version.
    # Needed for clang-3.8 and older - they need 4.9.x rather than 4.9.
    libstdcxx_dir=$(ls -d /usr/lib/gcc/$arch-linux-gnu/${libstdcxx_version}* \
      | tail -1)
    # Link the libstdc++ library directory to the new location
    ln -sfn "$libstdcxx_dir" "$toolchain_gcc/"
    # Now you can add "--gcc-toolchain=$toolchain_root" to the clang flags
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多