1

我有一个在 Ubuntu 12.04 下使用 clang++ 3.2 开发的 C++ 源代码树,它构建了一些库,然后使用这些库和其他各种系统库的通常集合编译一些应用程序。两个谜题。客户端报告由于未定义对clock_gettime() 的引用而无法构建代码。果然,我没有在构建逻辑(scons)中包含强制性的“-lrt”。

第一个难题:即使我没有在任何地方指定“-lrt”,它也可以正确编译、链接和执行,并且不会对我的系统产生任何抱怨!如何正确解析此符号?我怀疑这是因为应用程序链接到一个本身需要 librt 的动态库,但我不明白为什么会发生这种情况背后的逻辑?

第二个难题:假设在没有“-lrt”的情况下如何解决clock_gettime()的问题得到了令人满意的解释,为什么这会发生在我的系统上而不是客户端非常相似的设置上?

“……一个谜,包裹在一个谜中,一个谜”——温斯顿·丘吉尔

对揭示这里真实情况的工具的建议将受到欢迎。

4

1 回答 1

3

从 SUSv4(实用程序/c99):


-l rt

该选项应使所有在<aio.h><mqueue.h><sched.h><semaphore.h>和中引用的接口<spawn.h>、在 中标记为可选的<sys/mman.h>接口、在 中标记为 ADV(咨询信息)的接口以及以前缀和in<fcntl.h>开头的接口都可用。如果没有此选项,实现可能会搜索此库。clock_time_<time.h>


我认为以上至少足以证明为什么 POSIX 允许这种行为。

在这方面,所涉及的系统很可能是不同的。例如,clock_gettime()可能libc为您实施,但librt为您的客户实施。不要冒险:使用便携式设备-l rt并忘记这个问题。

一个更明显的例子是-l xnet,它的行为与 POSIX 相似,但是,至少在 Gentoo、Debian 和 Ubuntu Linux 系统上,编译-l xnet实际上会产生错误。(libxnet据称包含 UNIX 套接字接口的实现。)

如果您想进一步调查该问题,请ldd在 GNU/Linux 系统中尝试。ldd应该显示二进制文件的动态依赖项。我敢打赌,这clock_gettime()只是在libc.so.

于 2012-10-16T05:23:41.097 回答