2013-07-01 32 views
5

Epoch'dan bu yana geçen milisaniye sayısını almak istiyorum. çıkışC++ chrono duration_cast milisaniye saniye cinsinden sonuçlar

1372686001 

yılında g++g++ -std=c++11 main.cpp -o timetest gibi sonuçlara çağrısı ile bu derleme

#include <iostream> 
#include <chrono> 

int main() { 
    auto millitime = std::chrono::duration_cast<std::chrono::milliseconds> 
     (std::chrono::system_clock::now().time_since_epoch()).count(); 
    std::cout << millitime << std::endl; 
    return 0; 
} 

(burada Get time since epoch in milliseconds, preferably using C++11 chrono sorulan bu sorunun çözümlerinden biri) aşağıdaki gibi popüler bir çözüm eşit olan görünüyor epoch! 'den beri saniye sayısı.

Bu glibc'de bir hata mı? g ++? benim hatam?


Güncelleme

g++ (Debian 4.7.3-4) 4.7.3 ldd (Debian EGLIBC 2.17-6) 2.17 

: g ++ 4.8 kullanırken
çalışıyor. Yani bir gcc hatası mı ?!

g++-4.8 (Debian 4.8.1-2) 4.8.1 
+0

burada Gayet iyi çalışıyor: http://coliru.stacked-crooked.com/view?id=58cbeec8ffe15b00c4c5617e5c661e44-95b421f505320e75ab053309436f3288 –

+0

R.MartinhoFernandes aynı g ++ ve glibc sürümlerini kullanan do @? – example

+0

Bağlantıyı, g ++ -v'nin çıktısını içerecek şekilde düzenledim (4.8.1). Anlamı, bir hata olsaydı, düzeltildi. –

cevap

11

Sana GCC 4.7 ile derleme ancak çalışma zamanı bağlayıcı farklı bir GCC versiyonundan libstdc++.so kullanıyor ve bunlar std::chrono:system_clock için farklı hassasiyet ile yapılandırılmış olmasıdır neler düşünüyorum. GCC 4.7 ve ile derlemenizi sağlamak için LD_LIBRARY_PATH veya uygun linker seçeneklerini kullanırsanız, libstdc++.so kullanın ve sonuçlar doğru olmalıdır. Örneğin

:

$ $HOME/gcc/4.7.1/bin/g++ -std=c++11 t.cc 
$ ./a.out 
1372693222 
$ LD_LIBRARY_PATH=$HOME/gcc/4.7.1/lib64 ./a.out 
1372693225128 

system_clock::now() çağrı sonucu olan kitaplık, çalıştırma sırasında kullanılan bağlıdır böylece libstdc++.so kütüphanede, fakat farkı olur milliseconds bu değerden duration_cast dönüşüm derleme zamanında başlatılan satır içi şablonlarla yapılır. Derleme zamanı dönüşümü, çalışma zamanı çağrısı ile tutarlı değilse, sonuçlar tutarsız olur.

GCC 4.8.1 için system_clock uygulaması, clock_gettime sistem çağrısının her zaman kullanılabilir olması durumunda geliştirildi; bu, 4.7 için geçerli değildi, dolayısıyla GCC'nin nasıl yapılandırıldığına bakılmaksızın sürekli olarak yüksek hassasiyetli saat kullanıyor. muhtemelen 4.8.1 ile neden sorunu görmediğinizi açıklıyor.

libstdc++.so'un doğru sürümü çalışma zamanında kullanıldığından emin olmalısınız.

+0

parlak. Şimdiye kadar bu konuya hiç dikkat etmemeliydim (dürüst olmak gerekirse, can sıkıcı bir şey). Bunun yeni bir versiyon numarası için yeterli olduğunu beklerdim (libc'in farklı versiyonları açıkça uyumsuz!) ama iyi ...Benim için temizlediğin için teşekkürler – example

+1

Varsayılan konfigürasyonlarında kütüphaneler uyumludur, derleyicilerinden biri kütüphane ABI'sini değiştiren '--enable-libstdcxx-time' ile oluşturulmuş olmalıdır; uyumsuz kütüphanelerin karıştırılması. –

İlgili konular