C ++ - Fehler: undefinierter Verweis auf 'clock_gettime' und 'clock_settime'

157

Ich bin ziemlich neu in Ubuntu, aber ich kann nicht scheinen, dass dies funktioniert. Es funktioniert gut auf meinen Schulcomputern und ich weiß nicht, was ich nicht tue. Ich habe usr / include und time.h überprüft . Hier ist der Code:

#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;
}

Ich verwende CodeBlocks als IDE zum Erstellen und Ausführen. Jede Hilfe wäre toll, danke.

naspinski
quelle
Das brauchst du oft -D_XOPEN_SOURCE=600auch. Siehe auch GCC mit -std = c99 beschwert sich darüber, dass die Strukturzeitangabe nicht bekannt ist .
JWW

Antworten:

285

Am -lrtEnde der g ++ - Befehlszeile hinzufügen. Dieser Link befindet sich in der gemeinsam genutzten Bibliothek "Real Time" von librt.so.

Dmitry Yudakov
quelle
Das funktioniert, wenn ich manuell kompiliere - eine Idee, wie ich das in Codeblöcken automatisiere?
Naspinski
7
Versuchen Sie Projekt -> Build-Optionen -> Linker-Einstellungen. dann Bibliothek hinzufügen rt
Dmitry Yudakov
Ihr Vorschlag funktioniert gut für mich. Ich bin neu in C... was macht das -lrt?
Noufal
3
Tut mir leid, dass ich es in diesem Joint g++ -o main -lrt main.cppnicht bemerkt habe, aber könnten Sie das in einem vollständigen Beispiel verwenden? Etwas wie funktioniert bei mir nicht
puk
4
@puk Versuchen Sie, -lrtnach main.cpp- Reihenfolge der gemeinsam genutzten Bibliotheken Angelegenheit zu setzen - siehe dies oder das für weitere Details
Dmitry Yudakov
42

Beispiel:

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

Für gccVersion 4.6.1 -lrtmuss nach filefork.cpp sein, sonst erhalten Sie einen Linkfehler .

Einige ältere gccVersionen kümmern sich nicht um die Position.

Jing Kang
quelle
9
Vielen Dank, -lrtdass ich Kopfschmerzen hatte, weil ich nicht in der richtigen Position war. Gibt es irgendeine Motivation für diese verrückte (viele sagen kriminelle) Einstellung?
Avio
@ Avio - die Reihenfolge ist aus historischen Gründen wichtig. Compiler haben nur jedes Argument der Reihe nach verarbeitet. Da Bibliotheken "weiche" Referenzen sind, im Gegensatz zu "harten" Referenzen in den *.oArgumenten, werden die Bibliotheksfunktionen ignoriert, es sei denn, sie wurden zuvor referenziert, dh links.
Mark Lakata
28

Seit glibc Version 2.17 ist die Bibliotheksverknüpfung -lrtnicht mehr erforderlich.

Sie clock_*sind jetzt Teil der Hauptbibliothek C. In der Änderungshistorie von glibc 2.17, in der diese Änderung vorgenommen wurde, wird der Grund für diese Änderung erläutert:

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

Wenn Sie sich für ein Upgrade von glibc entscheiden, können Sie den Kompatibilitäts-Tracker von glibc überprüfen, wenn Sie Bedenken haben, ob bei Verwendung des neueren glibc Probleme auftreten könnten.

Führen Sie den folgenden Befehl aus, um die auf dem System installierte glibc-Version zu überprüfen:

ldd --version

(Wenn Sie altes glibc (<2.17) verwenden, benötigen Sie es natürlich noch -lrt.)

PP
quelle
26

Ich habe den gleichen Fehler festgestellt. In meinem Linker-Befehl war die RT-Bibliothek enthalten, -lrtdie korrekt ist und eine Weile funktioniert hat. Nach der Neuinstallation von Kubuntu funktionierte es nicht mehr.

Ein separater Forenthread schlug -lrtvor, nach den Projektobjektdateien zu kommen. Das Verschieben -lrtdes Befehls an das Ende des Befehls hat dieses Problem für mich behoben, obwohl ich nicht genau weiß, warum.

Adam
quelle
7
Twkm von ircnet zitieren: Der Linker führt nur eine Liste der benötigten Symbole. Sobald die Symbole einer Datei durchsucht wurden, wird nur das beibehalten, was sie benötigt, was sie bereitstellt, verworfen und zum nächsten Dateinamen verschoben. also von links nach rechts, aber sehr vergesslich.
Domen