Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clock_gettime()未定义的符号SunOS_C_Unix_Solaris_Sunos - Fatal编程技术网

clock_gettime()未定义的符号SunOS

clock_gettime()未定义的符号SunOS,c,unix,solaris,sunos,C,Unix,Solaris,Sunos,我正在尝试构建一个需要2个时间戳的程序: 第一个进程结束时的时间戳,然后是第二个进程开始时的时间戳。然后得到两者的增量 但是我无法编译,因为链接器抱怨clock\u 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 warr

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

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

#包括
#包括
#包括
#包括
#包括
无效延迟(无符号整数毫秒)
{
时钟目标=毫秒+时钟();
while(目标>时钟());
}
int main()
{       
结构timespec启动、停止;
双时间戳1;
双时间戳2;
文件*fOut;
fOut=fopen(“fileOut.txt”,“a”);
if(clock\u gettime(clock\u REALTIME,&start)=-1){
perror(“时钟获取时间”);
退出(退出失败);
}
timeStampFull1=(双精度)start.tv_sec+(双精度)(start.tv_nsec/100000000.0);
延迟(1);
if(clock\u gettime(clock\u REALTIME,&stop)=-1){
perror(“时钟获取时间”);
退出(退出失败);
}   
timeStampFull2=(双精度)stop.tv_sec+(双精度)(stop.tv_nsec/100000000.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);
返回0;
}
以下是编译器(链接器)错误:

现代版本Solaris上的
rt
(实时)库和古代版本的
posix4
库(从POSIX part 4又名POSIX.4用于“实时”扩展的时代起)中都有
clock_gettime()函数和许多其他函数。实时功能现在包含在基础中

因此,要解决
时钟\u gettime()

  • 在Solaris上添加
    -lrt
    ,或者添加
    -lposix4
    ,因为这不适合您
  • 在Linux上添加
    -lrt
  • 在macOS上添加这两个选项
在macOS上,函数(包括通常在
-lm
中找到的数学函数)位于主系统库中。苹果确实提供了一个虚拟的
-lm
库,但您不需要使用它

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

  • Solaris 11.2没有提到额外的库
  • Solaris 10建议您需要
    -lrt
  • Solaris 9还建议您需要
    -lrt
  • Solaris 8也建议使用
    -lrt
因此,从表面上看,使用
-lrt
应该对您有效。但是,如果您使用的是足够旧的Solaris版本(GCC的旧版本表明您可能没有使用最新版本的Solaris),那么您可能需要使用
-lposix4

谷歌搜索“libposix4.so solaris”会得到:

上面写着:

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

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

维护此库是为了为运行时和编译环境提供向后兼容性。共享对象在libc.so.1上实现为一个过滤器。新应用程序开发不需要指定
–lrt


回顾我的
makefile
的版本控制信息,我发现在1996年11月,我在makefile中添加了
-lposix4
;1993年6月的先前版本中没有这一点。那是很久以前的事了。我不确定您使用的是哪个版本的Solaris。Wikipedia on建议我对Solaris 2.4(1995)或Solaris 2.5(1996)进行更改。因此,可能是这些版本中的一个为
clock_gettime()
添加了
-lposix4
,也可能是我编写了一个程序,需要在该时间段内使用它,但它可以更早地使用。(只是为了好玩,第一个版本的
makefile
是1987-01-27。它已经存在了很长一段时间了!)

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

是否尝试添加
-lrt
?是的,但我也遇到了以下错误:time.c:49:2:警告:文件末尾没有换行ld:fatal:library-lrt:not found ld:fatal:file processing errors。没有写入time collect2的输出:ld返回1退出状态您使用的是什么版本的SunOS?表示它是CDE1.2。
uname-a
表示什么?哇!
-lposix4
工作正常。几天来我一直在努力解决这个问题。非常感谢。这是你正在使用的GCC的博物馆部分。目前的版本(再过一个月左右)是9.2.0;很快将达到10.1.0。GCC的第3版应该在十年前就已经退役了。@ice03如果
-lposix4
可以工作,但是
-lrt
不能工作,您的Solaris安装可能有问题。我想不起任何版本的Solaris没有librt.so
。如果您在
/lib
/usr/lib
中没有
librt.so
,那会让我想知道还缺少什么。@JonathanLeffler在帮助中说这台机器是CDE 1.2。@ice03:Google搜索“solaris CDE 1.2”时,我发现了solaris-2.4和2.6的古老版本。这些已经足够老了,可能在
librt之前。因此提供了
。通过升级到更新的硬件,你可能会节省很多电费。
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