我是靠谱客的博主 缓慢篮球,这篇文章主要介绍undefined reference to `stime‘引发的查看glibc版本号undefined reference to `stime’,现在分享给大家,希望可以做个参考。

undefined reference to `stime'

  • undefined reference to `stime'
    • 如何找到这个宏 __GLIBC_MINOR__

undefined reference to `stime’

在编译代码是出现了“undefined reference to `stime’”。实际上这个代码在公司的编译服务器(Ubuntu16.4)上并没有这个问题,但是有个同事使用的是Ubuntu20.4版本,编译的时候一直提示未定义。
查阅资料或者man手册(Ubuntu20.4中才有):

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DESCRIPTION top NOTE: This function is deprecated; use clock_settime(2) instead. stime() sets the system's idea of the time and date. The time, pointed to by t, is measured in seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). stime() may be executed only by the superuser. #不建议使用此功能;使用clock_settime(2)代替。stime()设置系统的时间和日期概念。 #时间,t所指向的时间,是自大纪元以来的秒数,1970-01-01 00:00:00 +0000(UTC)。 stime()只能由超级用户执行。 NOTES Starting with glibc 2.31, this function is no longer available to newly linked applications and is no longer declared in <time.h>. #从glibc2.31开始,此函数不再适用于新链接的应用程序,并且不再在<time.h>中声明。

然后查看ubuntu16.4和20.4的glibc版本使用一下命令:

复制代码
1
2
3
4
5
6
7
(16.4) wu@wu:~$ ldd --version ldd (Ubuntu GLIBC 2.23-0ubuntu10) 2.23 Copyright (C) 2016 自由软件基金会。 这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性 或者适合某些特殊目的。 由 Roland McGrath 和 Ulrich Drepper 编写。
复制代码
1
2
3
4
5
(20.4) wu@wu:~$ ldd --version ldd (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31 Copyright (C) 2020 自由软件基金会。。。。

正好说明了为什么在16.4中man手册没有NOTE的相关说明
解决版本办法则是:

复制代码
1
2
3
4
5
6
7
8
9
10
... #if __GLIBC_MINOR__ == 31 struct timespec res; res.tv_sec = set_now; clock_settime(CLOCK_REALTIME,&res); #else stime(&set_now); #endif ...

至此,编译问题解决了。但是这个问题并不是我解决的,我只是想学一下别人的思路,即,他是如何知道这个宏的—— “__GLIBC_MINOR__”。于是我自己查阅资料,装作自己没见过这个。

如何找到这个宏 __GLIBC_MINOR__

从一开始查怎么看glibc的版本号,发现都是在告诉你命令行怎么查看,并没有相关宏的信息。再到在源码中是如何确定这个版本号的,根据这个作者的提供:
https://stackoverflow.com/questions/9705660/check-glibc-version-for-a-particular-gcc-compiler

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* * 如果您关心的是编译时版本(即在中提供标头的版本/usr/include),则应查看宏__GLIBC__和__GLIBC_MINOR__。 * 这些扩展为正整数,将被定义为包括GNU C库提供的任何头文件的副作用; * 这意味着您可以包含标准标头,然后使用#ifdef __GLIBC__来决定是否可以包含非标准标头, * 例如gnu/libc-version.h * * 测试代码 */ #include <stdio.h> #ifdef __GLIBC__ #include <gnu/libc-version.h> #endif int main(void) { #ifdef __GLIBC __ printf("GNU libc compile-time version: %u.%un", __GLIBC__, __GLIBC_MINOR__); printf("GNU libc runtime version: %sn", gnu_get_libc_version()); return 0; #else puts("Not the GNU C Library"); return 1; #endif }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看依赖 (16.4) wu@wu:~$ ldd a.out |grep libc libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb08328a000) # 执行结果: wu@wu:~$ ./a.out wu@wu:~$ GNU libc compile-time version: 2.23 wu@wu:~$ GNU libc runtime version: 2.23 (20.4) wu@wu:~$ ./a.out wu@wu:~$ GNU libc compile-time version: 2.31 wu@wu:~$ GNU libc runtime version: 2.31

基本可以确定,glibc的版本好是由这两个宏共同定义的.

之后又在另外篇博客上看到了这两个宏的说明:

GUN C 语言函数库是 Linux 上最常用的库 (glibc) http://www.gnu.org/
应用程序可以通过测试常量和调用库函数两种方法,来确定系统安装的glibc版本,从2.0开始,glibc提供两个常量__GLIBC__ 和 __GLIBC_MINOR__

最后

以上就是缓慢篮球最近收集整理的关于undefined reference to `stime‘引发的查看glibc版本号undefined reference to `stime’的全部内容,更多相关undefined内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部