Error de C ++: referencia indefinida a 'clock_gettime' y 'clock_settime'


157

Soy bastante nuevo en Ubuntu, pero parece que no puedo hacer que esto funcione. Funciona bien en las computadoras de mi escuela y no sé lo que no estoy haciendo. He comprobado usr / include y time.h está bien. Aquí está el código:

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

Estoy usando CodeBlocks como mi IDE para construir y ejecutar también. Cualquier ayuda sería genial, gracias.


A menudo también lo necesitas -D_XOPEN_SOURCE=600. También vea GCC con -std = c99 se queja de no conocer la especificación de tiempo de struct .
jww

Respuestas:


285

Agregar -lrtal final de la línea de comandos de g ++. Esto enlaza en la biblioteca compartida librt.so "Tiempo real".


eso funciona si compilo manualmente. ¿Alguna idea de cómo automatizo eso en bloques de código?
naspinski

77
pruebe Proyecto -> Opciones de compilación -> Configuración del vinculador; luego agregue la biblioteca rt
Dmitry Yudakov

Su sugerencia funciona bien para mí ... Soy nuevo en C... ¿qué hace -lrt?
noufal

3
Perdón por novatarlo en esta articulación, pero ¿podría usar eso en un ejemplo completo? Algo así g++ -o main -lrt main.cppno funciona para mí
Puk

44
@puk Intenta poner -lrtdespués main.cpp- el orden de las bibliotecas compartidas importa - mira esto o aquello para más detalles
Dmitry Yudakov

42

ejemplo:

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

Para la gccversión 4.6.1, -lrtdebe ser posterior a filefork.cpp contrario, obtendrá un error de enlace.

Algunas gccversiones anteriores no se preocupan por el puesto.


9
Gracias, -lrtno estar en la posición correcta me estaba causando dolor de cabeza. ¿Hay alguna motivación para este entorno loco (bueno, muchos dicen criminal)?
Avio

@Avio: el pedido es importante por razones históricas. Los compiladores solían procesar cada argumento en orden. Debido a que las bibliotecas son referencias "blandas", a diferencia de las referencias "duras" en los *.oargumentos, las funciones de la biblioteca se ignoran a menos que se mencionen previamente, es decir, a la izquierda.
Mark Lakata

28

Desde glibc versión 2.17, el enlace de la biblioteca -lrtya no es necesario.

La clock_*ahora son parte de la biblioteca principal C. Puede ver el historial de cambios de glibc 2.17 donde se realizó este cambio explica la razón de este cambio:

+* 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 decide actualizar glibc, puede verificar el rastreador de compatibilidad de glibc si le preocupa si habría problemas al usar el glibc más nuevo.

Para verificar la versión de glibc instalada en el sistema, ejecute el comando:

ldd --version

(Por supuesto, si está utilizando glibc antiguo (<2.17), aún lo necesitará -lrt).


26

Encontré el mismo error. Mi comando de enlace tenía la biblioteca rt incluida-lrt que es correcta y estuvo funcionando durante un tiempo. Después de reinstalar Kubuntu, dejó de funcionar.

Un hilo separado del foro sugirió lo -lrtnecesario después de los archivos de objetos del proyecto. Mover -lrtal final del comando solucionó este problema para mí, aunque no sé los detalles de por qué.


77
Citando twkm desde ircnet: el enlazador solo mantiene una lista de símbolos necesarios. Una vez que se han buscado los símbolos de un archivo, solo se guarda lo que necesita, lo que proporciona se descarta y pasa al siguiente nombre de archivo. así que de izquierda a derecha, pero muy olvidadizo.
Domen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.