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)
该clock_gettime()函数和许多其他函数可以在rt现代版本 Solaris 上的(实时)库中找到,也可以在posix4库中找到(从有 POSIX 第 4 部分(又名 POSIX.4)用于“实时”扩展的日子开始) )在古代版本上。实时函数现已包含在基本POSIX 规范中。
因此,要解决clock_gettime():
-lrtor ,因为在 Solaris 上这对您不起作用-lposix4。-lrt。在 macOS 上,这些函数(包括 中常见的数学函数-lm)位于主系统库中。Apple 确实提供了一个虚拟-lm库,但您不需要使用它。
深入研究一些历史,一些旧版本的 Solaris(例如 Solaris 9,我认为 Solaris 10)提供了-lposix4;我没有使用过 Solaris 11,但我希望该库存在于其中,即使不再严格需要它。通常,手册页会告诉您使用函数所需的非标准库。浏览 Oracle 网站上的手册,我发现:
clock_gettime()没有提及额外的库。clock_gettime()建议您需要-lrt.clock_gettime()还建议您需要-lrt.clock_gettime()建议这样做-lrt。所以,从表面上看,使用-lrt应该对你有用。但是,如果您使用的是足够旧的 Solaris 版本(并且 GCC 的古董版本表明您可能没有使用最新版本的 Solaris),那么您可能需要使用 Solaris -lposix4。
在 Google 上搜索“libposix4.so Solaris”会得到:
\n它说:
\n\n\nlibrt、libposix4 - POSIX.1b 实时扩展库
\n从历史上看,该库中的函数提供了 POSIX.1b 实时扩展指定的许多接口。参见标准(5)。此功能现在驻留在 libc(3LIB) 中。
\n维护该库是为了为运行时和编译环境提供向后兼容性。共享对象作为 libc.so.1 上的过滤器实现。新应用程序开发无需指定
\n\xe2\x80\x93lrt。
回顾一下makefile我的版本控制信息,我发现在 1996 年 11 月,我添加-lposix4了一个 makefile;1993 年 6 月的先前版本中没有该内容。所以,那是很久(很久)以前的事了。我不确定您使用的是哪个版本的 Solaris。Solaris上的维基百科建议我对 Solaris 2.4 (1995) 或 Solaris 2.5 (1996) 进行更改。因此,可能是添加了这些版本之一-lposix4,clock_gettime()或者可能是我编写了一个在该时间范围内需要它的程序,但它更早可用。(仅供您娱乐,第一个版本的makefile日期为 1987-01-27。它已经存在相当长一段时间了!)