我无法使用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 ++”指令就足以使其中断。
感谢任何&amp;所有的帮助, 道格。
更新: 嗨 - 代码非常基本,但在尽可能基本的时候,我遇到了这个错误:
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 ++”指令时,我没有收到此错误。
答案 0 :(得分:1)
也许您应该考虑从llvm本身安装clang。这可以找到here。我不是100%肯定,但也许macports或类似的已经编译了你的版本与你安装的不同的gcc。 llvm下载是根据安装的gcc编译的,并且应该证明ABI兼容。
如果您按照llvm中的说明操作,也可以升级libc ++ .dynlib,但要注意MAC依赖于此的大量编程,因此您必须复制现有的lib(以防万一)。如果你想要前沿,你可能需要深入了解这些变化。我在mac上完成了这个,它非常好,可以很好地编译c ++ 11代码。
要构建libc ++,请参阅here
答案 1 :(得分:0)
有一个类似的问题here。
简而言之,当发生这种情况时,是因为其中一个可能的重载被声明为禁止,因此重载决策失败。为了解决这个问题,你应该明确地强制转换为禁止超载不是呼叫的解决方案之一。
请参阅链接问题的已接受答案,以获得非常详细和详尽的解释。