【问题标题】:clock_gettime() undefined symbol SunOSclock_gettime() 未定义符号 SunOS
【发布时间】:2020-05-26 09:43:27
【问题描述】:

我正在尝试构建一个需要 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

【问题讨论】:

  • 您是否尝试添加-lrt
  • 是的,但我也收到此错误:time.c:49:2: 警告:文件末尾没有换行符 ld:致命:库 -lrt:未找到 ld:致命:文件处理错误。没有输出写入时间 collect2:ld 返回 1 退出状态
  • 您使用的是哪个版本的 SunOS?
  • 说是CDE1.2。
  • uname -a 说什么?

标签: c unix solaris sunos


【解决方案1】:

clock_gettime() 函数和许多其他函数可在现代版 Solaris 的 rt(实时)库和 posix4 库中找到(从 POSIX 第 4 部分开始)又名 POSIX.4 用于“实时”扩展)在古代版本上。实时函数现在包含在基础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 实时扩展库

从历史上看,这个库中的函数提供了许多由 POSIX.1b 实时扩展指定的接口。见标准(5)。此功能现在位于 libc(3LIB) 中。

维护此库是为了为运行时和编译环境提供向后兼容性。共享对象被实现为 libc.so.1 上的过滤器。新应用开发无需指定–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。它已经存在了很长一段时间!)

【讨论】:

  • 哇! -lposix4 工作。几天来我一直在努力解决这个问题。非常感谢。
  • 这是您正在使用的 GCC 的博物馆作品。当前版本(再过一个月左右)是 9.2.0;很快就会是 10.1.0。 GCC 的第 3 版本应在十年前停用。
  • @ice03 如果-lposix4 有效,但-lrt 无效,则您的Solaris 安装可能有问题。我不记得任何没有librt.so 的Solaris 版本。如果您在/lib/usr/lib 中没有librt.so,那我会想知道还缺少什么。
  • @JonathanLeffler 在帮助中说这台机器是 CDE 1.2。
  • @ice03:谷歌搜索“solaris cde 1.2”表明 Solaris 的古老版本——2.4 和 2.6 出现在我面前。这些已经足够老了,可能是在提供librt.so 之前。通过升级到较新的硬件,您可能会节省很多电费。
【解决方案2】:

运行以下命令./configure LDFLAGS=-lrt CFLAGS=-lrt

【讨论】:

    猜你喜欢
    • 2014-03-27
    • 2016-03-02
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2012-11-07
    • 2012-09-05
    相关资源
    最近更新 更多