背景:为了学习c++11的多线程和lamda表达式的特性,升级了gcc(从4.4.6到4.7.1),写完thread程序编译时却发现还是遇到了一些问题。
原因:GCC没有定义这个宏:_GLIBCXX_USE_NANOSLEEP
解决办法:编译时加上选项:-D_GLIBCXX_USE_NANOSLEEP
或者:修改gcc的c++config.h文件去定义这个宏
再或者:重新安装gcc且使用选项:--enable-libstdcxx-time 。
详情:
(1)std::this_thread::sleep_for() and GCC
(2)来自Jonathan Wakely(a maintainer of the GNU C++ Standard Library (libstdc++) )的回答:
What is _GLIBCXX_USE_NANOSLEEP all about?
see also:C++11 'yield' is not a member of 'std::this_thread'
参考http://blog.csdn.net/cssmhyl/article/details/8114386编译4.7.2,对原作者表示感谢。
使用g++4.7.2熟悉c++11,遇到下面问题。。
'thread' isnotamemberof 'std
'yield' is not a member of 'std::this_thread'
sleep_for’ is not a member of ‘std::this_thread’
原因是编译时缺少选项所致,导致一些宏未产生在诸如c++config.h这样的文件中,编译出来的gcc有些新的命名空间对象对外隐藏了。
_GLIBCXX_HAS_GTHREADS _GLIBCXX_USE_NANOSLEEP _GLIBCXX_USE_SCHED_YIELD
这些宏只有被定义才能使用一些新函数 空间域 等,可以使用g++ -D宏名 来临时解决。
想一劳永逸只能重编gcc
只不过编译选项改为
configure --enable-languages=c,c++ --enable-libstdcxx-time --disable-checking --prefix=/usr/local/gcc-4.7.2 --disable-multilib --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1
--enable-languages,说明你要让你的gcc支持那些语言
--enable-libstdcxx-time,开启c++2011的一些新特性 时间 yield nanosleep this_thread etc..
--disable-multilib不生成编译为其他平台可执行代码的交叉编译器
--disable-checking生成的编译器在编译过程中不做额外检查
具体见官方http://gcc.gnu.org/install/configure.html文档。
libstdc++见http://gcc.gnu.org/onlinedocs/libstdc++/manual/configure.html。
重编后,g++可以使用c++11新特性。使用-std=c++11选项。
g++ -std=c++11 testc++11.cpp
文章的脚注信息由WordPress的wp-posturl插件自动生成