Errore C ++: riferimento indefinito a "clock_gettime" e "clock_settime"


157

Sono abbastanza nuovo su Ubuntu, ma non riesco a farlo funzionare. Funziona bene sui computer della mia scuola e non so cosa non sto facendo. Ho controllato usr / include e time.h è proprio bene. Ecco il codice:

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

Sto usando CodeBlocks come il mio IDE per compilare ed eseguire pure. Qualsiasi aiuto sarebbe fantastico, grazie.


Anche tu hai spesso bisogno -D_XOPEN_SOURCE=600. Vedi anche GCC con -std = c99 si lamenta di non conoscere struct timespec .
jww

Risposte:


285

Aggiungi -lrtalla fine della riga di comando g ++. Questo collega nella libreria condivisa "Real Time" di librt.so.


funziona se compilo manualmente - hai idea di come automatizzarlo nei blocchi di codice?
naspinski,

7
prova Progetto -> Opzioni di costruzione -> Impostazioni linker; quindi aggiungi la libreria rt
Dmitry Yudakov il

Il tuo suggerimento funziona bene per me C... Sono nuovo di ... che cosa fa -lrt?
noufal,

3
Mi dispiace non pensarci più in questo comune, ma potresti usarlo in un esempio completo, qualcosa di simile g++ -o main -lrt main.cppnon funziona per me
puk

4
@puk Prova a mettere -lrtdopo main.cpp- l'ordine delle biblioteche condivise conta - vedi questo o quello per maggiori dettagli
Dmitry Yudakov,

42

esempio:

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

Per la gccversione 4.6.1, -lrtdeve essere dopo filefork.cpp, altrimenti viene visualizzato un errore di collegamento.

Ad alcune gccversioni precedenti non interessa la posizione.


9
Grazie, il -lrtnon essere nella posizione giusta mi stava causando mal di testa. C'è qualche motivazione per questa impostazione folle (beh, molti dicono criminale)?
Avio,

@Avio: l'ordine è importante per motivi storici. I compilatori erano soliti elaborare ogni argomento in ordine. Poiché le librerie sono riferimenti "soft", al contrario dei riferimenti "hard" negli *.oargomenti, le funzioni della libreria vengono ignorate a meno che non vengano citate in precedenza, il che significa che a sinistra.
Mark Lakata,

28

Dalla versione 2.17 di glibc, il collegamento alla libreria -lrtnon è più necessario.

L' clock_*ora sono parte della libreria C principale. Puoi vedere la cronologia delle modifiche di glibc 2.17 in cui è stata apportata questa modifica spiega il motivo di questa modifica:

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

Se decidi di aggiornare glibc, puoi controllare il tracker di compatibilità di glibc se sei preoccupato se ci sarebbero problemi usando il glibc più recente.

Per verificare la versione di glibc installata sul sistema, eseguire il comando:

ldd --version

(Ovviamente, se stai usando il vecchio glibc (<2.17) allora avrai ancora bisogno -lrt.)


26

Ho riscontrato lo stesso errore. Il mio comando linker includeva la libreria rt -lrtche è corretta e funzionava da un po '. Dopo aver reinstallato Kubuntu ha smesso di funzionare.

Un thread del forum separato ha suggerito la -lrtnecessità di venire dopo i file degli oggetti del progetto. Lo spostamento -lrtalla fine del comando ha risolto questo problema per me, anche se non conosco i dettagli del perché.


7
Citando twkm da ircnet: il linker mantiene solo un elenco di simboli necessari. una volta cercati i simboli di un file, viene conservato solo ciò di cui ha bisogno, ciò che fornisce viene scartato e passa al nome file successivo. così da sinistra a destra, ma molto smemorato.
domen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.