web-dev-qa-db-fra.com

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

Je suis assez nouveau pour Ubuntu, mais je n'arrive pas à obtenir que cela fonctionne. Cela fonctionne bien sur les ordinateurs de mon école et je ne sais pas ce que je ne fais pas. J'ai vérifié sr/include et time.h y est 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 en tant que mon IDE pour générer et exécuter également. Toute aide serait formidable, merci.

153
naspinski

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

277
Dmitry Yudakov

exemple:

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

Pour gcc version 4.6.1, -lrt doit être après filefork.cpp sinon vous obtenez une erreur de lien.

Une version plus ancienne gcc ne se soucie pas de la position.

42
jing kang

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

Un fil de discussion séparé a suggéré que le -lrt devait venir après les fichiers d'objet du projet. Déplacer le -lrt à la fin de la commande a corrigé ce problème pour moi bien que je ne connaisse pas les détails de la raison.

26
Adam

Depuis la version 2.17 de la glibc, la bibliothèque reliant -lrt n'est plus requise.

Les clock_* font maintenant partie de la bibliothèque C principale. Vous pouvez voir le historique des modifications de la glibc 2.17 l'emplacement 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 à jour la glibc, vous pouvez alors vérifier le suivi de la compatibilité de la glibc si vous craignez que la nouvelle glibc ne pose pas de problème.

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

ldd --version

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

25
P.P.