clock_gettime() 未定义符号 SunOS

ice*_*e03 3 c unix solaris sunos

我正在尝试构建一个需要 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.
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)

这是编译器(链接器)错误:

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
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

clock_gettime()函数和许多其他函数可以在rt现代版本 Solaris 上的(实时)库中找到,也可以在posix4库中找到(从有 POSIX 第 4 部分(又名 POSIX.4)用于“实时”扩展的日子开始) )在古代版本上。实时函数现已包含在基本POSIX 规范中。

\n

因此,要解决clock_gettime()

\n
    \n
  • 添加-lrtor ,因为在 Solaris 上这对您不起作用-lposix4
  • \n
  • 在 Linux 上添加-lrt
  • \n
  • 在 macOS 上两者都不添加。
  • \n
\n

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

\n

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

\n\n

所以,从表面上看,使用-lrt应该对你有用。但是,如果您使用的是足够旧的 Solaris 版本(并且 GCC 的古董版本表明您可能没有使用最新版本的 Solaris),那么您可能需要使用 Solaris -lposix4

\n

在 Google 上搜索“libposix4.so Solaris”会得到:

\n\n

它说:

\n
\n

librt、libposix4 - POSIX.1b 实时扩展库

\n

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

\n

维护该库是为了为运行时和编译环境提供向后兼容性。共享对象作为 libc.so.1 上的过滤器实现。新应用程序开发无需指定\xe2\x80\x93lrt

\n
\n

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

\n