Помилка 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 для створення та запуску також. Будь-яка допомога була б чудовою, дякую.


Вам також часто потрібно -D_XOPEN_SOURCE=600. Також дивіться GCC з -std = c99 скаржиться на те, що не знає структуру timepec .
jww

Відповіді:


285

Додати -lrtв кінець командного рядка g ++. Це посилання в бібліотеці спільного користування librt.so "Реальний час".


це працює, якщо я компілюю вручну - будь-яка ідея, як я автоматизую це в кодових блоках?
naspinski

7
спробуйте Project -> Options Options -> Settings Link; потім додайте бібліотеку rt
Дмитро Юдаков

Ваша пропозиція добре працює для мене ... Я новачок у C... що робить -lrt?
noufal

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_*вони є частиною основної бібліотеки С. Ви можете побачити історію змін 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 .)


26

Я зіткнувся з тією ж помилкою. У мою команду лінкера була включена бібліотека rt-lrt яка є правильною, і вона працювала деякий час. Після перевстановлення Kubuntu він перестав працювати.

Окремий потік форуму запропонував -lrtвиконати потрібні файли об'єктів проекту. Переміщення -lrtдо кінця команди вирішило цю проблему для мене, хоча я не знаю подробиць, чому.


7
Цитуючи twkm від ircnet: лінкер підтримує лише список необхідних символів. Після пошуку символів файлу зберігається лише те, що йому потрібно, те, що він надає, відкидається і переходить до наступного імені файлу. так зліва направо, але дуже забудькувано.
Домен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.