Ошибка C ++: неопределенная ссылка на «clock_gettime» и «clock_settime»

157

Я довольно новичок в 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 для сборки и запуска. Любая помощь будет отличной, спасибо.

naspinski
источник
Тебе -D_XOPEN_SOURCE=600тоже часто нужно . Также см. GCC с жалобами на -std = c99 о незнании struct timepec .
августа

Ответы:

285

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

Дмитрий Юдаков
источник
это работает, если я скомпилирую вручную - есть идея, как автоматизировать это в кодовых блоках?
Naspinski
7
попробуйте Проект -> Параметры сборки -> Настройки компоновщика; затем добавьте библиотеку rt
Дмитрий Юдаков
Ваше предложение работает хорошо для меня .. Я новичок в C... что делает -lrt?
Нуфал
3
Извините, что noob это в этом суставе, но не могли бы вы использовать это в полном примере, что-то вроде g++ -o main -lrt main.cppне работает для меня
puk
4
@puk Попробуйте положить -lrtпосле main.cpp- порядка разделяемых библиотек дела - увидеть это или что для получения более подробной информации
Дмитрий Юдаков
42

пример:

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

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

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

Цзин Кан
источник
9
Спасибо, то, что я -lrtне в правильном положении, вызвало у меня головную боль. Есть ли мотивы для этого сумасшедшего (ну, многие говорят, криминального) сеттинга?
Авио
@ Avio - порядок имеет значение по историческим причинам. Компиляторы раньше просто обрабатывали каждый аргумент по порядку. Поскольку библиотеки являются «мягкими» ссылками, в отличие от «жестких» ссылок в *.oаргументах, библиотечные функции игнорируются, если на них не ссылаются ранее, то есть слева.
Марк Лаката
28

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

Теперь они 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), то вам все равно понадобится -lrt.)

PP
источник
26

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

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

Адам
источник
7
Цитата twkm из ircnet: компоновщик поддерживает только список необходимых символов. после поиска символов в файле сохраняется только то, что ему нужно, то, что он предоставляет, отбрасывается и переходит к следующему имени файла. так слева направо, но очень забывчиво.
Домен