Erreur C ++: référence non définie à 'clock_gettime' et 'clock_settime'

157

Je suis assez nouveau sur Ubuntu, mais je n'arrive pas à faire fonctionner cela. Cela fonctionne bien sur les ordinateurs de mon école et je ne sais pas ce que je ne fais pas. J'ai vérifié usr / include et time.h est là très bien. Voici le 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;
}

J'utilise CodeBlocks comme IDE pour construire et exécuter également. Toute aide serait formidable, merci.

naspinski
la source
Vous en avez souvent besoin -D_XOPEN_SOURCE=600aussi. Voir aussi GCC avec -std = c99 se plaint de ne pas connaître la structure timespec .
jww

Réponses:

285

Ajoutez -lrtà la fin de la ligne de commande g ++. Ce lien dans la bibliothèque partagée librt.so "Real Time".

Dmitry Yudakov
la source
cela fonctionne si je compile manuellement - une idée de la façon dont j'automatise cela dans les blocs de code?
naspinski
7
essayez Projet -> Options de construction -> Paramètres de l'éditeur de liens; puis ajoutez la bibliothèque rt
Dmitry Yudakov
Votre suggestion fonctionne bien pour moi .. Je suis nouveau dans C... qu'est-ce que cela -lrtfait?
noufal
3
Désolé de ne pas le faire dans cette articulation, mais pourriez-vous utiliser cela dans un exemple complet, quelque chose comme g++ -o main -lrt main.cppne fonctionne pas pour moi
puk
4
@puk Essayez de mettre -lrtaprès main.cpp- l'ordre des bibliothèques partagées compte - voir ceci ou cela pour plus de détails
Dmitry Yudakov
42

exemple:

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

Pour la gccversion 4.6.1, -lrtdoit être après filefork.cpp sinon vous obtenez une erreur de lien.

Certaines gccversions plus anciennes ne se soucient pas de la position.

jing kang
la source
9
Merci, le fait de -lrtne pas être dans la bonne position me causait un mal de tête. Y a-t-il une motivation pour ce cadre fou (enfin, beaucoup disent criminel)?
Avio
@Avio - l'ordre compte pour des raisons historiques. Les compilateurs traitaient simplement chaque argument dans l'ordre. Étant donné que les bibliothèques sont des références «souples», par opposition aux références «matérielles» dans les *.oarguments, les fonctions de bibliothèque sont ignorées à moins qu'elles ne soient référencées précédemment, ce qui signifie, à gauche.
Mark Lakata
28

Depuis la version 2.17 de la glibc, la liaison de bibliothèque -lrtn'est plus nécessaire.

Ils clock_*font désormais partie de la bibliothèque C principale. Vous pouvez voir l' historique des modifications de la glibc 2.17 où cette modification a été effectuée explique la raison de cette modification:

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

Si vous décidez de mettre à niveau la glibc, vous pouvez vérifier le suivi de compatibilité de la glibc si vous êtes préoccupé par le fait qu'il y aurait des problèmes avec la nouvelle glibc.

Pour vérifier la version de la glibc installée sur le système, exécutez la commande:

ldd --version

(Bien sûr, si vous utilisez l'ancienne glibc (<2.17), vous en aurez toujours besoin -lrt.)

PP
la source
26

J'ai rencontré la même erreur. Ma commande de l'éditeur de liens avait la bibliothèque rt incluse, -lrtce qui est correct et cela fonctionnait pendant un certain temps. Après avoir réinstallé Kubuntu, il a cessé de fonctionner.

Un fil de discussion distinct du forum a suggéré le -lrtnécessaire pour venir après les fichiers objets du projet. Déplacer le -lrtà la fin de la commande a résolu ce problème pour moi bien que je ne sache pas en détail pourquoi.

Adam
la source
7
Citant twkm d'ircnet: l'éditeur de liens ne maintient qu'une liste de symboles nécessaires. une fois que les symboles d'un fichier ont été recherchés, seul ce dont il a besoin est conservé, ce qu'il fournit est rejeté et il passe au nom de fichier suivant. donc de gauche à droite, mais très oublieux.
domen