【发布时间】:2014-03-23 03:13:39
【问题描述】:
考虑下面这段代码
#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,应该是100000000左右
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,应该是100000000左右
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
相差100156418,应该是100000000左右
似乎无论如何,用g++-4.8 编译使用任何libstdc++ 都可以正常工作,而使用g++-4.7 编译会导致出现故障。
我在编译器/二进制调用中做错了什么还是g++-4.7 中的错误? (具体是g++-4.7.3和g++-4.8.1)
对于(可能是最丑陋的)解决方法,我当然可以测量一小段时间,将其与预期差异进行比较并得出一个因素。不过我很想优雅地解决这个问题。
【问题讨论】:
-
如果有帮助,此页面提到 C++11 时钟 ABI 在 GCC 4.8.1 中发生了更改:gcc.gnu.org/gcc-4.8/changes.html
-
@JohnZwinck 这可能是相关的,但我不知道如何用 4.7 解决这种情况(我想要至少两个编译器版本用于我正在开发的产品。在工作中,只有我的开发机器有 4.8,所有其他机器运行
-
GCC 4.7 对 C++11 没有 100% 的工作支持,所以你可能在那里不走运,或者至少需要一些讨厌的解决方法。我不太确定,也无法从 GCC 网站找到更具体的问题报告。
-
@JohnZwinck 嗯,这是我正在开发的一个可选功能,所以如果这在 4.7 中无法修复,它已经过时了。但它是如此闪亮的功能(当然不是这里的演示代码;-))
-
除了他们在 4.7 版本之后修复了一个错误之外,还有什么可行的结论吗?如果 4.7 曾经工作过,那么您安装的 stdlib 二进制文件和头文件之间不兼容。但这将是错误配置的一个例外情况。
标签: c++ c++11 g++ libstdc++ chrono