clock_gettime () неопределенный символ SunOS - PullRequest
2 голосов
/ 11 февраля 2020

Я пытаюсь создать программу, которая использует 2 метки времени: метку времени в конце первого процесса, затем метку времени в начале второго процесса. Затем получите дельту двух.

Но я не могу скомпилировать, потому что компоновщик жалуется на clock_gettime, что приводит к неопределенной ошибке символа.

gcc (GCC) 3.2.1
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

void delay(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

int main()
{       
    struct timespec start, stop;

    double timeStampFull1;
    double timeStampFull2;

    FILE *fOut;
    fOut = fopen("fileOut.txt", "a");

    if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
        perror( "clock gettime" );
        exit( EXIT_FAILURE );   
    }

    timeStampFull1 = (double)start.tv_sec + (double)(start.tv_nsec/1000000000.0); 

    delay(1);

    if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
        perror( "clock gettime" );
        exit( EXIT_FAILURE );
    }   

    timeStampFull2 = (double)stop.tv_sec + (double)(stop.tv_nsec/1000000000.0);

    printf("tv1: %f \n", timeStampFull1);
    printf("tv2: %f \n", timeStampFull2);

    fprintf(fOut, "TimeStartOfTest\t\t\t%f\n", timeStampFull1);
    fprintf(fOut, "TimeEndOfTest\t\t\t%f\n", timeStampFull2);


    fclose(fOut);

    return 0;
}

Вот компилятор ( компоновщик) ошибка:

gcc -Wall -o time ./time.c
time.c:49:2: warning: no newline at end of file
Undefined                       first referenced
 symbol                             in file
clock_gettime                       /var/tmp//ccuu5CKe.o
ld: fatal: Symbol referencing errors. No output written to time
collect2: ld returned 1 exit status

1 Ответ

3 голосов
/ 11 февраля 2020

Функция clock_gettime() и ряд других функций можно найти в библиотеке rt (в режиме реального времени) в современных версиях Solaris и в библиотеке posix4 (со времен POSIX, часть 4 ака POSIX.4 для расширений «реального времени») на старых версиях. Функции реального времени теперь включены в базовую спецификацию POSIX .

Итак, для разрешения clock_gettime():

  • Добавить либо -lrt, либо, так как это не сработало для вас, -lposix4 в Solaris.
  • Добавьте -lrt в Linux.
  • Добавьте ни в macOS.

Вкл macOS, функции (включая математические функции, часто встречающиеся в -lm) находятся в основной системной библиотеке. Apple предоставляет фиктивную библиотеку -lm, но вам не нужно ее использовать.

Погружаясь в историю, некоторые старые версии Solaris, такие как Solaris 9 и, как мне кажется, Solaris 10, предоставляют -lposix4; Я не использовал Solaris 11, но я ожидал, что библиотека там будет существовать, даже если она больше не нужна. Обычно страницы справочника рассказывают о нестандартных библиотеках, которые необходимы для использования функции. Просматривая руководства на сайте Oracle, я обнаружил:

  • Solaris 11.2 clock_gettime() не упоминает дополнительную библиотеку.
  • Solaris 10 clock_gettime() предполагает, что вам нужно -lrt.
  • Solaris 9 clock_gettime() также предполагает, что вам нужно -lrt.
  • Solaris 8 clock_gettime() также предлагает -lrt.

Так что, на первый взгляд, использование -lrt должно сработать для вас. Однако, если вы используете достаточно старую версию Solaris (а старая версия G CC предполагает, что вы, вероятно, не используете последнюю версию Solaris), то вам, возможно, придется использовать -lposix4.

Поиск в Google по запросу «libposix4.so solaris» дает:

, где говорится:

librt, libposix4 - библиотека расширений реального времени POSIX.1b

Исторически функции в этой библиотеке обеспечивали многие интерфейсы, определенные расширением реального времени POSIX.1b. Смотрите стандарты (5). Эта функциональность теперь находится в lib c (3LIB).

Эта библиотека поддерживается для обеспечения обратной совместимости как для среды выполнения, так и для сред компиляции. Общий объект реализован в виде фильтра в lib c .so.1. При разработке новых приложений не нужно указывать –lrt.

Возвращаясь к информации об управлении версиями для моего makefile, я обнаружил, что в ноябре 1996 года я добавил -lposix4 в make-файл; предыдущая версия от июня 1993 года не содержала этого. Итак, это было долгое (долгое) время go. Я не уверен, какую версию Solaris вы используете. Википедия по Solaris предполагает, что я внес изменения для Solaris 2.4 (1995) или Solaris 2.5 (1996). Возможно, одна из этих версий добавила -lposix4 для clock_gettime(), или же я написал программу, нуждающуюся в этом, но она была доступна ранее. (Просто для вашего удовольствия, первая версия makefile была датирована 1987-01-27. Она существует довольно давно!)

...