web-dev-qa-db-ja.com

clangはgccライブラリを使用しているようです

clangを使用するのはこれが初めてです。私が気づくのは、stdライブラリを参照するclangからのエラーは次のようになることです。

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7:
                ^^^                  ^^^                         ^^^

そのため、clangリンク(または少なくともインクルード)にgccライブラリーが含まれているように見えます。

私が使用したコマンド:clang++ -c -Wall -Wextra -Werror -g test.cpp -o test.o。 (プログラムはこれを証明するためだけに意図的なエラーがありました)。

これはどのようにして可能ですか? clangに独自のライブラリを使用させるにはどうすればよいですか(ただし、gccを壊さない)


追加情報:

私はUbuntu 14.04マシンを使用しています。

clang++ --version
Ubuntu clang version 3.5-1ubuntu1 (trunk) (based on LLVM 3.5)
Target: x86_64-pc-linux-gnu
Thread model: posix

g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.

私は以前、gccupdate-alternativesのいくつかのバージョンを(同時にapt-getで使用して)インストールしました。現在、4.8しかありません(他のものをアンインストールしました)。そのとき、何かを台無しにしたのでしょうか?私はclangをインストールしたことがありません(Ubuntuではデフォルトだと思います)。

明確にするために:正しいプログラムはclang++でコンパイルおよび実行されます。

さらなるテスト:gccis_trivially_constructibleのような型をまだ実装しておらず、標準のc ++ 11ライブラリのiostreamに対する移動操作を実装していないことを知っています( https:/ /gcc.gnu.org/onlinedocs/libstdc++/manual/status.html )とそのclangには完全なc ++ 11準拠のライブラリがあるため、clangでコンパイルしたものをテストしたところ、対応するgccエラーが発生しました。 clangはgccライブラリを使用しています。

非常に基本的なプログラム

#include <iostream>
using namespace std;

int main() { 
  cout << "Yada Yada" << endl;
  return 0;
}

clang ++で-std = c ++ 1yを使用してコンパイルすると、このエラーが発生します。

In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/iostream:39:
...
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:120:11: error: no member named 'gets' in the global namespace
  using ::gets;
        ~~^

したがって、現時点では、c++1yをclangでコンパイルすることはできません。

24
bolov

libc++をインストールし、-stdlib=libc++でclangに使用させる必要があります

24
Baum mit Augen

私は同様の問題を抱えていました:GCC(g ++)はすでにLinuxMint(Ubuntuベース)にインストールされているため、clangでコンパイルすると、「エラー::: getsを使用してグローバル名前空間に「gets」という名前のメンバーがありませんでした。

libc ++-dev(Sudo apt-get install libc++-dev)および-stdlib ++(clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld

11
Rolis

あなたの本当の問題は、GCC 4.8に属するC++ライブラリで、C++ 14(c ++ 1yはまだ完全に形成されていないときにそれを参照するために使用される非公式の名前でした)を使用していることです。 GCC 4.8は完全なC++ 11サポートを備えていますが、C++ 14機能でさえほとんど開始されていません。

これは、C++ 14がstd::getsを削除したために発生し、GNU Cライブラリは、グローバルネームスペースにgetsを定義しないことで、C++ライブラリがまだ追いついて、それをstd名前空間で使用できるようにしようとしています。

これを適切に解決するには、libc ++を使用する必要はありません。C++ 14をサポートするC++ライブラリを使用するだけです。 GLIBCXX 4.9(別名libstdc ++)はすでに十分です。

5
Giel