人咬狗:符号在没有链接库的情况下解析?clock_gettime()-lrt
Man Bites Dog: symbol resolved *without* linking library? clock_gettime() -lrt
我有一个在Ubuntu 12.04下使用clang++3.2开发的C++源代码树,它构建了一些库,然后用这些库和其他各种系统库的常用集合编译一些应用程序。两个谜题。客户端报告代码无法通过对clock_gettime()的未定义引用进行构建。果不其然,我没有在构建逻辑(scons)中包含强制性的"-lrt"。
第一个难题:即使我没有在任何地方指定"-lrt">,它也能在我的系统上正确地编译、链接和执行,而且没有任何抱怨!如何正确解析此符号?我怀疑这是因为应用程序链接到一个动态库,而这个动态库本身需要librt,但我不明白为什么会发生这种情况?
第二个难题:假设对clock_gettime()如何在没有"-lrt"的情况下得到解决有一个令人满意的解释,为什么这种情况会发生在我的系统上,而不会发生在客户端非常相似的设置上?
"…一个谜,包裹在一个谜里"---温斯顿·丘吉尔
建议使用工具来揭示这里的真实情况将是最受欢迎的。
来自SUSv4(实用程序/c99):
-l rt
该选项应使<aio.h>
、<mqueue.h>
、<sched.h>
、<semaphore.h>
和<spawn.h>
中引用的所有接口、<sys/mman.h>
中标记为可选的接口、<fcntl.h>
中标记为ADV(咨询信息)的接口以及<time.h>
中以前缀clock_
和time_
开头的接口可用在没有此选项的情况下,实现可能会搜索此库
我认为以上内容至少足以证明POSIX允许这种行为的原因。
在这方面,所涉及的系统很可能是不同的。例如,clock_gettime()
可能在libc
中为您实现,但在librt
中为您的客户端实现。不要冒险:使用便携式-l rt
,然后忘记这个问题。
一个更明显的例子是-l xnet
,它的行为与POSIX类似,但至少在Gentoo、Debian和UbuntuLinux系统上,使用-l xnet
编译实际上会产生错误。(据称libxnet
包含UNIX套接字接口的实现。)
如果您想进一步调查这个问题,请在GNU/Linux系统中尝试ldd
。ldd
应该显示二进制文件的动态依赖关系。我敢打赌,clock_gettime()
只是在libc.so
中实现的。
- 使用 SendInput 或 mouse_event 不适用于 clock()?
- 为什么我们可以在 c++ 中使用 srand(clock())?
- 除了使用 clock() 函数之外,有没有更好的方法来以给定的频率生成/发布数据
- IBM AIX std::clock()?
- Windows C 上的getTime ofday行为
- 为什么常量CLOCKS_PER_SEC不需要用 std:: 命名,但 <ctime> clock() 和 clock_t 可以呢?
- 当我使用 cin 时,我如何使用 clock() 测量时间
- 'clock()' 给出通常的时钟而不是 CPU 时钟
- 使用Clock()函数测量程序的运行时间
- 为什么我的sf :: clock在sfml中单独重置
- C++:Linux 中的计时(使用 clock())不同步(由于 OpenMP?)
- 如何在Linux上获得C 代码块的时钟刻度?clock()结果没有意义
- clock :: getElapSedTime()被调用时SFML 2.0崩溃
- 为什么在使用基于 clock() 的计时器宏时会得到负值
- clock() 函数始终返回 0
- 使用 clock() 函数调度任务时出现问题
- C++ VMWare Fusion/Boot Camp 下 VS2010 中 ctime 的 clock() 方法出现问题
- 为什么clock()被认为是坏的
- MFC/C++:需要遥远的"wall clock"时间而不重置系统的时间
- c++ 中的 clock() 时间和 java 中的 System.CurrentTimeMillis() 之间的时间差