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.
私は以前、gcc
とupdate-alternatives
のいくつかのバージョンを(同時にapt-get
で使用して)インストールしました。現在、4.8
しかありません(他のものをアンインストールしました)。そのとき、何かを台無しにしたのでしょうか?私はclangをインストールしたことがありません(Ubuntuではデフォルトだと思います)。
明確にするために:正しいプログラムはclang++
でコンパイルおよび実行されます。
さらなるテスト:gcc
はis_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でコンパイルすることはできません。
libc++
をインストールし、-stdlib=libc++
でclangに使用させる必要があります
私は同様の問題を抱えていました: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
)
あなたの本当の問題は、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 ++)はすでに十分です。