Błąd C ++: niezdefiniowane odwołanie do „clock_gettime” i „clock_settime”

157

Jestem całkiem nowy w Ubuntu, ale nie wydaje mi się, żeby to zadziałało. Działa dobrze na moich szkolnych komputerach i nie wiem, czego nie robię. Sprawdziłem usr / include i time.h jest w porządku. Oto 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;
}

Używam CodeBlocks jako mojego IDE do budowania i uruchamiania. Każda pomoc byłaby świetna, dziękuję.

naspiński
źródło
Ty też często potrzebujesz -D_XOPEN_SOURCE=600. Zobacz także GCC z -std = c99 narzeka, że ​​nie zna struct timespec .
jww

Odpowiedzi:

285

Dodaj -lrtna końcu wiersza poleceń g ++. To prowadzi do biblioteki współdzielonej librt.so "Real Time".

Dmitrij Yudakov
źródło
to działa, jeśli kompiluję ręcznie - masz pomysł, jak zautomatyzować to w blokach kodu?
naspinski
7
wypróbuj Projekt -> Opcje kompilacji -> Ustawienia konsolidatora; następnie dodaj bibliotekę rt
Dmitry Yudakov
Twoja sugestia działa dla mnie dobrze C… Jestem nowy w … co to daje -lrt?
Noufal
3
Przepraszam, że nie robię tego w tym lokalu, ale czy mógłbyś użyć tego w pełnym przykładzie, coś takiego g++ -o main -lrt main.cppnie działa dla mnie
puk
4
@puk Spróbuj wstawić -lrtpo main.cpp- kolejność współdzielonych bibliotek ma znaczenie - zobacz to lub tamto, aby uzyskać więcej informacji
Dmitrij Yudakov
42

przykład:

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

W gccwersji 4.6.1 -lrtmusi znajdować się po pliku filefork.cpp, w przeciwnym razie pojawi się błąd łącza.

Niektóre starsze gccwersje nie dbają o pozycję.

jing kang
źródło
9
Dziękuję, -lrtbycie w złej pozycji przyprawiało mnie o ból głowy. Czy jest jakaś motywacja do tego szalonego (cóż, wielu mówi, że kryminalny) ustawienie?
Avio,
@Avio - kolejność ma znaczenie ze względów historycznych. Kompilatory po prostu przetwarzały każdy argument po kolei. Ponieważ biblioteki są „miękkimi” odwołaniami, w przeciwieństwie do „twardych” odwołań w *.oargumentach, funkcje biblioteczne są ignorowane, chyba że zostały wcześniej przywołane, czyli po lewej stronie.
Mark Lakata
28

Od wersji 2.17 biblioteki glibc łączenie bibliotek -lrtnie jest już wymagane.

clock_*Są teraz częścią głównej biblioteki C. Możesz zobaczyć historię zmian biblioteki glibc 2.17, gdzie ta zmiana została dokonana, wyjaśnia powód tej zmiany:

+* 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.

Jeśli zdecydujesz się zaktualizować glibc, możesz sprawdzić moduł śledzenia zgodności glibc, jeśli obawiasz się, czy wystąpią jakiekolwiek problemy z używaniem nowszego glibc.

Aby sprawdzić wersję glibc zainstalowaną w systemie, uruchom polecenie:

ldd --version

(Oczywiście, jeśli używasz starego glibc (<2.17), nadal będziesz go potrzebować -lrt.)

PP
źródło
26

Napotkałem ten sam błąd. Moje polecenie konsolidatora zawierało bibliotekę rt-lrt która jest poprawna i działała przez jakiś czas. Po ponownym zainstalowaniu Kubuntu przestał działać.

Osobny wątek na forum sugerował, że -lrtnależy przyjść po plikach obiektów projektu. Przeniesienie -lrtkomendy na koniec rozwiązało ten problem, chociaż nie wiem, dlaczego.

Adam
źródło
7
Cytując twkm z ircnet: konsolidator utrzymuje tylko listę potrzebnych symboli. po przeszukaniu symboli pliku zachowywane jest tylko to, czego potrzebuje, a to, co dostarcza, jest odrzucane i przechodzi do następnej nazwy pliku. tak od lewej do prawej, ale bardzo zapominalski.
domenę