web-dev-qa-db-ja.com

16.04 clang:gccツールチェーンの選択が不適切

Gcc(5.4.0および6.0.0)とclang 3.8(1:3.8-33ubuntu3.1)の2つの16.04システムがあります。最初のシステムでは、clangはC++コードのコンパイルに成功します。 -vを追加すると、重要な出力部分は次のとおりです。

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/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/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
[...]
#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0
 /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/x86_64-linux-gnu/c++/5.4.0
 /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/backward
 /usr/local/include
 /usr/lib/llvm-3.8/bin/../lib/clang/3.8.0/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

しかし、別のシステムでは失敗します。詳細な出力ショー

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/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/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/6.0.0

ただし、このバージョンのGCC6にはヘッダーが含まれていないため、コンパイルは失敗します。

#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/6.0.0/../../../../include/c++
 /usr/local/include
 /usr/lib/llvm-3.8/bin/../lib/clang/3.8.0/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
In file included from TimeHelper.cc:1:
./TimeHelper.hh:4:10: fatal error: 'cstdint' file not found
#include <cstdint>

ヘッダーは/usr/include/c++/5/にありますが、このパスはここにはリストされていません。 (libstdc ++-5-devがインストールされています。)

システムは同一ではありませんが、どちらも最新のものです(本日更新)。

問題の原因を調べる方法

推奨ツールチェーンは、構成ファイルに組み込まれていますか、または推奨されていますか?

注意:--gcc-toolchainのような値に/usr/lib/gcc/x86-64-linux-gnu/5を明示的に指定しようとすると失敗します。clangはディレクトリをGCCインストールパスとして認識しないようです。それとは異なり、手動GCCビルドのターゲットディレクトリを指定することは成功します(ただし、デフォルトで動作することを確認したいです)。

2
Netch

Clang 4.0をインストールした後(これだけでは問題は解決しませんでした)、clang 3.8の残りの部分、gccgoを削除し、同じパッケージからGCC 5を再インストールした後に修正しました。これで、適切なバージョンが選択されます。

選択アルゴリズムの詳細が不足しているため、この結果の原因を正確に言うことはできません。とにかく、それは動作します。

0
Netch

動作するマシンで:

$ find /usr/include/c++/ -name cstdint
/usr/include/c++/5/tr1/cstdint
/usr/include/c++/5/cstdint
$ dpkg -S /usr/include/c++/5/cstdint
libstdc++-5-dev:AMD64: /usr/include/c++/5/cstdint

libstdc++-5-devにあります。

http://packages.ubuntu.com/xenial/libstdc++-5-dev

http://packages.ubuntu.com/xenial/AMD64/libstdc++-5-dev/filelist

libstdc++-6-devを見てみましょう:

http://packages.ubuntu.com/zesty/libstdc++-6-dev

http://packages.ubuntu.com/zesty/arm64/libstdc++-6-dev/filelist

...
/usr/include/c++/6/cstdint
...
...
/usr/include/c++/6/tr1/cstdint
...
0
Velkan