Ошибка C ++: неопределенная ссылка на «clock_gettime» и «clock_settime» - PullRequest
150 голосов
/ 10 марта 2010

Я довольно новичок в Ubuntu, но я не могу заставить это работать. Он отлично работает на моих школьных компьютерах, и я не знаю, что я не делаю. Я проверил usr / include и time.h там просто отлично. Вот код:

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

Я использую CodeBlocks в качестве среды IDE для сборки и запуска. Любая помощь будет великолепна, спасибо.

Ответы [ 4 ]

273 голосов
/ 10 марта 2010

Добавьте -lrt в конец командной строки g ++. Это ссылки в общей библиотеке "Real Time" librt.so.

41 голосов
/ 11 ноября 2011

пример:

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

Для gcc версии 4.6.1 -lrt должно быть после filefork.cpp в противном случае вы получите ошибку ссылки.

Некоторые старые gcc версии не заботятся о положении.

26 голосов
/ 10 ноября 2011

Я столкнулся с той же ошибкой. Моя команда компоновщика действительно включала библиотеку rt -lrt, что правильно, и она работала некоторое время. После переустановки Kubuntu перестал работать.

В отдельной ветке форума предлагалось указать -lrt после файлов объектов проекта. Перемещение -lrt в конец команды устранило эту проблему для меня, хотя я не знаю деталей, почему.

25 голосов
/ 18 сентября 2015

Начиная с glibc 2.17, библиотека, связывающая -rt, больше не требуется.

clock_* теперь является частью основной библиотеки C. Вы можете увидеть историю изменений glibc 2.17 , где это изменение было сделано, объясняет причину этого изменения:

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

Если вы решите обновить glibc, то вы можете проверить трекер совместимости в glibc , если вас беспокоит, возникнут ли какие-либо проблемы с использованием более нового glibc.

Чтобы проверить версию glibc, установленную в системе, введите команду:

ldd --version

(Конечно, вы используете старый glibc (<2.17), тогда вам все равно понадобится <code>-lrt.)

...