11

clang と libc++ のコンパイル、実行、NetBeans との統合、さらには 32 ビット マシンへのクロスコンパイルまで相当な労力を費やした後、すべてを理解したと思いました。そこで、libstdc++ になかったいくつかの機能 (開発環境をひっくり返す理由) を使用し、発見しました...実際にはそれができません。

libc++ がインストールされ、動作し、コンパイルされたプログラム (動作する場合) がそれを必要とします。ただし、コンパイラは、名前空間をいじることによって、あらゆる機会に libstdc++ バージョンを使用しようとします。std::__1::mapstd::__1::basic_stringなど。今、私はこの質問から、なぜそれが起こるのか、そしてなぜlibc ++がそれをするのかを知っています. 完全に適用できないため、それを消去する方法を知る必要があるだけです-私は本当に、本当にlibc ++バージョンを使用したいのですが、コードには2つのタイプが共存する必要があるものは何もありません.

libstdc++ フォルダーをインクルード パスから外そうとしましたが、失敗すると完全にアクセスできなくなりました。運がない。アドオン ライブラリは使用せず、組み込みの Linux/POSIX ヘッダー (errno、socket、syslog、fcntl) のみを使用しています。

編集:エラー メッセージ:

CoreCache.cpp:61:12: error: no member named 'emplace' in 'std::__1::map<std::__1::basic_string<char>, CacheEntry, std::__1::less<std::__1::basic_string<char> >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, CacheEntry> > >'

libstdc++ マップには emplace() がありません。libc++ バージョン.

コマンドラインからの次の呼び出しは機能しているようです。

clang++ -o stachecache -I /usr/local/lib/clang/3.1/include/ -I /usr/include/c++/v1/ -std=c++0x -stdlib=libc++ ./*.cpp

NetBeans 内からの呼び出しは、次のことを行いません。

clang++ -stdlib=libc++ -O3   -c -O3 -Werror -MMD -MP -MF build/Release/clang-Linux-x86/CoreCache.o.d -o build/Release/clang-Linux-x86/CoreCache.o CoreCache.cpp
4

1 に答える 1

2

コメントから:

araqnid: NetBeans 呼び出し-std=c++0xに がありません。必要ないのですか? std::map::emplaceC++11 メソッドです。

DigitalMan (OP): @araqnid 実際にできました! Clang は、その引数が使用されていないことに不満を漏らしていました。実際、それが使用され、必要とされている場合でも、まだ使用されています。そのため、NetBeans 構成から削除しました。確かに、不完全な警告は完全なエラーよりも優れています。

于 2012-01-28T12:30:13.507 に答える