2010-03-10 22 views
136

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á muy bien. Aquí está el código:Error Ubuntu Ubuntu C++: referencia indefinida a 'clock_gettime' y 'clock_settime'

#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 compilar y ejecutar también. Cualquier ayuda sería genial, gracias.

Respuesta

250

Agregue -lrt al final de la línea de comandos de g ++. Esto enlaza en la biblioteca compartida librt.so "Real Time".

+0

eso funciona si compilo manualmente, ¿alguna idea de cómo automatizo eso en los bloques de código? – naspinski

+7

prueba Proyecto -> Opciones de compilación -> Configuración del enlazador; luego agregue la biblioteca rt –

+0

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

26

Encontré el mismo error. Mi comando linker tenía la biblioteca rt incluida -lrt que es correcta y estaba funcionando por un tiempo. Después de volver a instalar Kubuntu, dejó de funcionar.

Un hilo de foro separado sugirió que el -lrt debía venir después de los archivos del objeto del proyecto. Al mover el -lrt al final del comando me arregló este problema aunque no conozco los detalles de por qué.

+1

¿Podría publicar un enlace al hilo del foro? –

+5

Citando dos kilómetros de ircnet: el vinculador solo mantiene una lista de símbolos necesarios. una vez que se han buscado los símbolos de un archivo, solo se conserva lo que necesita, lo que proporciona se descarta y pasa al siguiente nombre de archivo. de izquierda a derecha, pero muy olvidadizo. – domen

41

ejemplo:

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

Para gcc versión 4.6.1, -lrt debe ser despuésfilefork.cpp de otro modo se obtiene un error de enlace.

Algunas versiones anteriores de gcc no se preocupan por la posición.

+9

Gracias, el '-lrt' que no estaba en la posición correcta me causaba un dolor de cabeza. ¿Hay alguna motivación para este ajuste loco (bueno, muchos dicen criminal)? – Avio

+0

@Avio: el orden importa por razones históricas. Los compiladores solían procesar cada argumento en orden. Debido a que las bibliotecas son referencias "suaves", a diferencia de las referencias "duras" en los argumentos '* .o', las funciones de la biblioteca se ignoran * a menos que * se mencionen anteriormente, lo que significa, a la izquierda. –

23

Desde glibc 2.17, la biblioteca que une -rt ya no es necesaria.

El clock_* ahora son parte de la biblioteca principal de C. Se puede ver la change history of glibc 2.17 donde este cambio fue hecho 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, a continuación, se puede comprobar la compatibility tracker of glibc si le preocupa si habría ningún problema usando la más reciente glibc

Para comprobar la versión de glibc instalado en el sistema, ejecute el comando:

ldd --version 

(. Por supuesto, está utilizando glibc antigua (< 2.17), entonces que te todavía necesita -lrt)

+1

de hecho la información correcta, muy útil – cpp11dev

Cuestiones relacionadas