2016-08-30 51 views
4

(Ubuntu的16.04.1)锵++ --gcc工具链和gcc 4.9.3链接问题

默认情况下,在16.04.1铛是采摘gcc的工具链5.4。不幸的是,我有一个库,要求 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工具链,铛似乎接受,那么完全忽略值。 (同样的事情发生在16.04.1的铿锵++ - 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

您是否找到解决方案?我也在处理一个非常类似的问题。 – antosecret

+0

我不得不快速的工作,所以我提出了叮铛声,直到我们可以得到同一ABI下的所有项目。现在我恢复了GCC,直到我有机会再次处理工具链问题。 – ErnieE

回答

0

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

0

不幸的是我有需要先行5.0 ABI和我没有到源

你不需要切换GCC工具链改变ABI作为新版本的GCC访问的库有dual-abi的支持。

要切换ABI重写预处理宏:

clang++ -D_GLIBCXX_USE_CXX11_ABI=0 

所以,我建议你建立你需要自己的工具链,并通过安装前缀--gcc工具链选项。

如果它是可用的,你可能想要通过模仿你的/ usr文件夹通过符号链接来使用你选择的工具链,同时排除你不需要的gcc版本。

0

由于Gaetano在链接票中写道,您需要建立一个单独的目录,可以传递给叮当的--gcc-toolchain。这是我稍微改进的代码。不需要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