Erro C ++: referência indefinida a 'clock_gettime' e 'clock_settime'


157

Eu sou muito novo no Ubuntu, mas não consigo fazer isso funcionar. Funciona bem nos computadores da minha escola e não sei o que não estou fazendo. Eu verifiquei usr / include e time.h está lá muito bem. Aqui está o 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;
}

Estou usando o CodeBlocks como meu IDE para criar e executar também. Qualquer ajuda seria ótimo, obrigado.


Você também precisa frequentemente -D_XOPEN_SOURCE=600. Veja também o GCC com -std = c99 reclama de não saber o tempo de estrutura .
JWW

Respostas:


285

Adicione -lrtao final da linha de comando do g ++. Isso vincula a biblioteca compartilhada librt.so "Real Time".


que funciona se eu compilar manualmente - alguma idéia de como eu automatizo isso em codeblocks?
09

7
tente Projeto -> Opções de compilação -> Configurações do vinculador; em seguida, adicione a biblioteca rt
Dmitry Yudakov

Sua sugestão funciona bem para mim C.. Eu sou novo em ... o que -lrtfaz?
Noufal

3
Desculpe a noob-lo nesta articulação, mas você poderia usar isso em um exemplo completo, somehing como g++ -o main -lrt main.cppnão funciona para mim
puk

4
@puk Tente colocar -lrtdepois main.cpp- ordem de bibliotecas compartilhadas importa - ver este ou aquele para mais detalhes
Dmitry Yudakov

42

exemplo:

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

Para a gccversão 4.6.1, -lrtdeve ser após filefork.cpp, caso contrário, você receberá um erro de link.

Alguma gccversão mais antiga não se importa com a posição.


9
Obrigado, -lrtnão estar na posição correta estava me causando dor de cabeça. Existe alguma motivação para esse cenário louco (bem, muitos dizem criminoso)?
Avio

@Avio - a ordem é importante por razões históricas. Os compiladores costumavam processar cada argumento em ordem. Como as bibliotecas são referências "flexíveis", em oposição às referências "rígidas" nos *.oargumentos, as funções da biblioteca são ignoradas, a menos que sejam referenciadas anteriormente, ou seja, à esquerda.
precisa saber é o seguinte

28

Desde o glibc versão 2.17, a vinculação da biblioteca -lrtnão é mais necessária.

O clock_*agora fazem parte da biblioteca C principal. Você pode ver o histórico de alterações do glibc 2.17 em que essa alteração foi feita explica o motivo dessa alteração:

+* 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 você decidir atualizar o glibc, poderá verificar o rastreador de compatibilidade do glibc se estiver preocupado se haverá algum problema ao usar o glibc mais recente.

Para verificar a versão glibc instalada no sistema, execute o comando:

ldd --version

(Obviamente, se você estiver usando o glibc antigo (<2.17), ainda precisará -lrt.)


26

Eu encontrei o mesmo erro. Meu comando vinculador tinha a biblioteca rt incluída, o -lrtque está correto e estava funcionando por um tempo. Após reinstalar o Kubuntu, ele parou de funcionar.

Um tópico de fórum separado sugeriu o -lrtnecessário para vir após os arquivos de objeto do projeto. Mover -lrtpara o final do comando corrigiu esse problema para mim, embora eu não saiba os detalhes do porquê.


7
Citando dois quilômetros da ircnet: o vinculador mantém apenas uma lista de símbolos necessários. Uma vez pesquisados ​​os símbolos de um arquivo, apenas o que ele precisa é mantido, o que ele fornece é descartado e passa para o próximo nome de arquivo. tão da esquerda para a direita, mas muito esquecido.
Domen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.