C ++ hatası: 'clock_gettime' ve 'clock_settime' için tanımsız başvuru


157

Ubuntu için oldukça yeniyim, ama bunun işe yaramasını sağlayamıyorum. Okul bilgisayarlarımda iyi çalışıyor ve ne yapmadığımı bilmiyorum. Ben usr / include ve time.h kontrol var gayet iyi. İşte kod:

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    //do stuff here
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    return 0;
}

Ben de oluşturmak ve çalıştırmak için IDE olarak CodeBlocks kullanıyorum. Herhangi bir yardım harika olurdu, teşekkürler.


Siz de sık sık ihtiyacınız var -D_XOPEN_SOURCE=600. Ayrıca yapı zamanını bilmemekten -std = c99 şikayetiyle GCC'ye bakınız .
jww

Yanıtlar:


285

-lrtG ++ komut satırının sonuna ekleyin . Bu link librt.so "Gerçek Zamanlı" paylaşılan kütüphanesinde.


manuel derleme çalışır - herhangi bir fikir nasıl kod blokları otomatikleştirmek?
naspinski

7
Project -> Derleme Seçenekleri -> Bağlayıcı Ayarları'nı deneyin; sonra kitaplık rt ekleyin
Dmitry Yudakov

Önerin benim için iyi çalışıyor .. Ben yeni C... ne yapar -lrt?
noufal

3
Bu eklemde noob için üzgünüm, ama tam bir örnekte kullanabilirsiniz, gibi bir g++ -o main -lrt main.cppşey benim için çalışmıyor
puk

4
@puk -lrtSonra paylaşmayı deneyin main.cpp- paylaşılan kütüphanelerin sırası önemlidir - daha fazla ayrıntı için şu veya bu
şeye

42

misal:

c++ -Wall filefork.cpp -lrt -O2

İçin gccsürümü 4.6.1, -lrtolmalıdır sonra filefork.cpp aksi takdirde bir bağlantı hatası alıyorum.

Bazı eski gccsürümlerin konumu umursamaz.


9
Teşekkür ederim, -lrtdoğru pozisyonda olmamak başım ağrıyor. Bu çılgınca (pek çoğu suçlu olduğunu söyleyen) ortam için herhangi bir motivasyon var mı?
Avio

@Avio - düzen tarihsel nedenlerle önemlidir. Derleyiciler, her bir argümanı sırayla işlemek için kullanılır. Kütüphaneler, *.oargümanlardaki "sert" referansların aksine "yumuşak" referanslar olduğu için , daha önce sola atıfta bulunulmadığı sürece kütüphane fonksiyonları yok sayılır .
Mark Lakata

28

Glibc sürüm 2.17 olduğundan, kütüphane bağlantısı -lrtartık gerekli değildir.

clock_*Şimdi ana C kütüphanesinin bir parçasıdır. Görebilirsiniz glibc 2.17 arasında değişiklik geçmişini yapıldı bu değişiklik, bu değişikliğin nedenini şöyle açıklıyor:

+* The `clock_*' suite of functions (declared in <time.h>) is now available
+  directly in the main C library.  Previously it was necessary to link with
+  -lrt to use these functions.  This change has the effect that a
+  single-threaded program that uses a function such as `clock_gettime' (and
+  is not linked with -lrt) will no longer implicitly load the pthreads
+  library at runtime and so will not suffer the overheads associated with
+  multi-thread support in other code such as the C++ runtime library.

Glibc'yi yükseltmeye karar verirseniz, daha yeni glibc'yi kullanmanın herhangi bir sorun olup olmayacağından endişe ediyorsanız glibc'in uyumluluk izleyicisini kontrol edebilirsiniz .

Sistemde yüklü glibc sürümünü kontrol etmek için şu komutu çalıştırın:

ldd --version

(Elbette, eski glibc (<2.17) kullanıyorsanız, yine de ihtiyacınız olacaktır -lrt.)


26

Aynı hatayla karşılaştım. Linker komutum -lrtdoğru olan rt kütüphanesini içeriyordu ve bir süre çalışıyordu. Kubuntu'yu yeniden yükledikten sonra çalışmayı durdurdu.

Ayrı bir forum iş parçacığı -lrt, proje nesne dosyalarından sonra gelmesi gerektiğini önerdi . Hareketli -lrtneden ayrıntılarını bilmiyorum ancak komutun sonuna benim için bu sorunu düzeltildi.


7
İrcnet'ten twkm alıntı yapılıyor: linker sadece gerekli sembollerin listesini tutar. bir dosyanın sembolleri arandığında, yalnızca ihtiyacı olan şey tutulur, sağladığı şey atılır ve sonraki dosya adına taşınır. soldan sağa ama çok unutkan.
domen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.