3

clang 3.1 を使用してコンパイルする C++11 プロジェクトを取得できません。コンパイラへのコマンドは次のとおりです。

clang++-mp-3.1 -c -std=c++11 -stdlib=libc++ -Wall -g -Iinclude -I/usr/local/include -I/opt/local/include -I/usr/local/include/mongo -o world.o world.cpp

そして、「-stdlib=libc++」ディレクティブを含めたために発生するエラーは次のとおりです。

In file included from world.cpp:1:
/usr/include/c++/v1/string:1952:10: error: overload resolution selected implicitly-deleted copy assignment operator
    __r_ = _STD::move(__str.__r_);
         ^
/usr/include/c++/v1/string:1942:9: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign' requested here
        __move_assign(__str, true_type());
        ^
/usr/include/c++/v1/string:1961:5: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign' requested here
    __move_assign(__str, integral_constant<bool,
    ^
/usr/include/c++/v1/utility:200:24: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=' requested here
struct _LIBCPP_VISIBLE pair
                       ^
/usr/include/c++/v1/memory:1941:5: note: copy assignment operator is implicitly deleted because '__compressed_pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>
      >::__rep, std::__1::allocator<char> >' has a user-declared move constructor
    __compressed_pair(__compressed_pair&& __p)
    ^
1 error generated.

どうすればこれを機能させることができるかについて、誰かが私にアドバイスできますか?

コンパイルしようとしているファイルには、このエラーが発生するために C++11 コードを含める必要さえありません。「-stdlib=libc++」ディレクティブだけで問題が発生します。

ダグ、あらゆる支援に感謝します。

更新: こんにちは -- コードはかなり基本的なものですが、可能な限り基本的なものにする際に、次のエラーに遭遇しました:

Undefined symbols for architecture x86_64:
  "std::__1::cout", referenced from:
      _main in world.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

このエラーを取得するために、コードを次のように削除しました。

#include <iostream>
int main( int argc, char *argv[] )
{
  std::cout << "Hi.\n";
}

これにより、これはかなり根本的に間違っているように見えます。

「-stdlib=libc++」ディレクティブをコンパイラに取り出すと、このエラーは発生しません。

4

2 に答える 2

1

おそらく、llvm 自体から clang をインストールすることを検討する必要があります。これはここにあります。100% 確実ではありませんが、おそらく macports などによって、インストールされているものとは異なる gcc に対してバージョンがコンパイルされた可能性があります。llvm ダウンロードは、インストールされている gcc に対してコンパイルされており、ABI 互換性を証明する必要があります。

llvm の指示に従えば、libc++.dynlib をアップグレードすることもできますが、MAC の非常に多くのプログラムがこれに依存しているため、(念のため) 既存の lib のコピーを作成する必要があることに注意してください。ブリーディングエッジが必要な場合は、これらの変更に飛び込む必要があるかもしれません. 私はこれをMacで実行しましたが、完全に問題なく、c ++ 11コードを問題なくコンパイルできました。

libc++ をビルドするには、こちらを参照してください

于 2012-07-22T20:16:26.980 に答える