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.