(Ubuntu 16.04.1)
默认情况下,16.04.1 clang正在选择5.4的gcc工具链。不幸的是,我有一个需要 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选项。 (两者都建议作为类似问题的解决方案。)
我缺少什么?(我希望它很简单,并且有点头脑!)
答案 0 :(得分:0)
您似乎正在向--gcc-toolchain
选项传递错误的路径。它期望GCC安装前缀的路径,如果GCC安装了包管理器,则为/usr
。但是,如果您的系统中安装了多个版本的GCC并且它们都具有相同的前缀,我认为不可能选择使用哪个工具链。似乎clang只采用$PREFIX/lib/gcc/x86_64-linux-gnu
目录中的最新版本。因此,我建议您自己构建自己需要的工具链,并将安装前缀传递给--gcc-toolchain
选项。
答案 1 :(得分:0)
不幸的是我有一个需要5.0之前的ABI的库,我无法访问源
您不需要切换gcc-toolchain来更改ABI,因为较新的gcc版本支持dual-abi。
切换ABI覆盖预处理器宏:
clang++ -D_GLIBCXX_USE_CXX11_ABI=0
因此,我建议您自己构建自己需要的工具链,并将安装前缀传递给--gcc-toolchain选项。
如果它可用,你可能想通过符号链接模仿/ usr文件夹,同时排除你不需要的gcc版本来欺骗clang使用你选择的工具链。
答案 2 :(得分:0)
正如Gaetano在链接故障单中所写,您需要构建一个单独的目录,该目录可以作为--gcc-toolchain
传递给clang。这是我稍微改进过的代码。无需bin
和include
个链接。
# 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