我正试图在Linux上编写一些软件,在我的Mac上使用一些漂亮的新C++0x功能。我使用MacPorts安装了gcc45包,它给了我/opt/local/bin/g++-mp-4.5,但是这个编译器不想在<thread>中编译任何东西。我试着编译:
//test.cpp
#include <thread>
int main()
{
std::thread x;
return 0;
}并得到:
bash-3.2$ /opt/local/bin/g++-mp-4.5 -std=c++0x test.cpp
test.cpp: In function 'int main()':
test.cpp:5:2: error: 'thread' is not a member of 'std'
test.cpp:5:14: error: expected ';' before 'x'在/opt/local/include/gcc45 45/c++/线程中快速查看显示,已定义了std::线程类,但由以下内容保护:
#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)同样,这在我的Ubuntu机器上工作得很好,那么在c++0x 4.5 ( g++ -mp-4.5)的MacPorts版本下启用g++ <thread>库的正确方法是什么?否则,我还需要知道什么(配置标志等)吗?在我亲自编写gcc 4.5之前?
更新:--看起来SO社区对此不太了解,所以也许是时候靠近开发人员了。有谁知道我可以把这个问题转发给官方邮件列表吗?有什么礼仪建议可以帮我得到答案吗?
更新2: --我请求了另一个临时解决方案-- 这里,所以我现在只是将boost::线程库替换为std库。不幸的是,未来并没有提振::未来,所以这还不是一个完全的解决方案。任何帮助仍将是非常感谢的。
发布于 2011-01-15 13:38:27
实际上,<thread>库在Mac下不起作用,因为这里的线程没有带超时的函数(例如,pthread_mutex_timedlock())。这个函数的可用性必须是使用已选中宏的_POSIX_TIMEOUTS宏,但是在MacOSX10.4、10.5和10.6中它被定义为-1 (我不知道10.7是什么),而在pthread.h中确实没有这些函数。
_POSIX_TIMEOUTS宏在libstdc++配置期间进行检查。如果检查成功结束,则定义_GLIBCXX_HAS_GTHREADS宏。<thread>含量随-std=c++0x的增加而增加。
libstdc++确实需要_POSIX_TIMEOUTS,例如在std::timed_mutex类实现中(参见<mutex>报头)。
总之,我认为当GCC的线程或libstdc++实现pthread_mutex_timedlock() (和其他)仿真,或者当这个函数将在Mac上实现时,Mac上就会出现libstdc++。
或者,在未来的C++标准中,可能会有一种方法来查询语言特性(例如,这个定时函数和类),并且可以在禁用此功能的情况下构建libstdc++。然而,我不太熟悉未来的标准,并且对这个特性有疑问。
发布于 2012-03-08 22:32:05
更新- gcc4.7现在允许编译on:看这里
https://stackoverflow.com/questions/4456602
复制相似问题