考虑下面的代码用的std ::时辰:: SYSTEM_CLOCK /的std ::计时时间差:: high_resolution_clock
#include <chrono>
#include <iostream>
#include <thread>
int main()
{
using std::chrono::system_clock;
using std::chrono::milliseconds;
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
const auto duration = milliseconds(100);
const auto start = system_clock::now();
std::this_thread::sleep_for(duration);
const auto stop = system_clock::now();
const auto d_correct = duration_cast<nanoseconds>(duration).count();
const auto d_actual = duration_cast<nanoseconds>(stop - start).count();
std::cout << "Difference is " << d_actual << ", and it should be roughly " << d_correct << "\n";
}
我们期待什么是
差异化路线的东西是100039989,应该大致为100000000
请参阅this demo它在哪里工作绝对好。
但是,在我的机器上,根据this answer here on Stack Overflow安装了几个似乎会导致错误配置的编译器。
因此我尝试了建议的修复方法:设置正确的LD_LIBRARY_PATH
。 这些是与输出组合我试图(除其他与4.4和4.6 ...)
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
差异是100126,并且它应该是大致亿
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
差值为100132,应该大致为100000000
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
不同的是100085953,它应该大致亿
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
不同的是100156418,它应该大致亿
看来,无论怎么样,与g++-4.8
编译使用任何libstdc++
工作正常,而与g++-4.7
编译导致断开坐uation。
我在编译器/二进制调用这里做错了什么,或者它是g++-4.7
中的错误? (这是g++-4.7.3
和g++-4.8.1
要具体)
对于(可能的最难看)的解决方法,我可以的时候微量当然措施,它比较与预期的差异,并拿出一个因素。不过,我很想优雅地解决这个问题。
如果有帮助,此页面提到C++ 11时钟ABI在GCC 4.8.1中发生了变化:http://gcc.gnu.org/gcc-4.8/changes.html –
@JohnZwinck这可能与此有关,但我没有看到4.7怎样才能解决这个问题(我希望至少有两个编译器版本适用于我正在开发的产品。在工作中,只有我的开发机器有4.8,所有其他机器运行的不足4.7) – stefan
GCC 4.7没有为C++ 11提供100%的工作支持,所以你可能会在那里运气不佳,或者至少需要一些讨厌的解决方法。我不太确定,也无法从GCC网站挖掘更具体的问题报告。 –