clock_gettime() 未定义符号 SunOS

clock_gettime() undefined symbol SunOS

我正在尝试构建一个需要 2 个时间戳的程序: 第一个进程结束时的时间戳,然后是第二个进程开始时的时间戳。然后得到两者的delta。

但我无法编译,因为链接器抱怨 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

clock_gettime() 函数和许多其他函数可以在现代版本的 Solaris 的 rt(实时)库中找到,在 posix4 库(来自在古代版本上有 POSIX 第 4 部分又名 POSIX.4 用于 'Real Time' 扩展的日子。实时函数现在包含在基础 POSIX specification.

所以,解决clock_gettime()

  • 在 Solaris 上添加 -lrt 或者,因为这对您不起作用,所以添加 -lposix4
  • 在 Linux 上添加 -lrt
  • 在 macOS 上都不添加。

在 macOS 上,函数(包括 -lm 中常见的数学函数)位于主系统库中。 Apple 确实提供了一个虚拟 -lm 库,但您不需要使用它。

深入研究一些历史,一些旧版本的 Solaris,例如 Solaris 9,我认为,Solaris 10 提供 -lposix4;我没有使用过 Solaris 11,但我希望该库存在于那里,即使不再严格需要它。通常,手册页会告诉您使用函数所需的非标准库。浏览 Oracle 站点上的手册,我发现:

因此,从表面上看,使用 -lrt 应该对您有用。但是,如果您使用的是足够旧的 Solaris 版本(GCC 的旧版本表明您可能没有使用最新版本的 Solaris),那么您可能需要使用 -lposix4 代替。

Google 搜索 'libposix4.so solaris' 得到:

上面写着:

librt, libposix4 - POSIX.1b Realtime Extensions library

Historically, functions in this library provided many of the interfaces specified by the POSIX.1b Realtime Extension. See standards(5). This functionality now resides in libc(3LIB).

This library is maintained to provide backward compatibility for both runtime and compilation environments. The shared object is implemented as a filter on libc.so.1. New application development need not specify –lrt.

回头查看我的一个makefile的版本控制信息,我发现在1996年11月,我在一个makefile中添加了-lposix4; 1993 年 6 月的先前版本中没有此内容。所以,那是很久(很久)以前的事了。我不确定您使用的是哪个版本的 Solaris。 Solaris 上的维基百科建议我对 Solaris 2.4 (1995) 或 Solaris 2.5 (1996) 进行更改。因此,可能是其中一个版本为 clock_gettime() 添加了 -lposix4,或者可能是我在那个时间段内编写了一个需要它的程序,但它更早可用。 (仅供娱乐,makefile 的第一个版本日期为 1987-01-27。它已经存在了很长一段时间!)

运行 按照命令 ./configure LDFLAGS=-lrt CFLAGS=-lrt