【问题标题】:What way can code be written so libraries don't need to be called in C?有什么方法可以编写代码以便不需要在 C 中调用库?
【发布时间】:2016-07-27 17:11:08
【问题描述】:

我正在探索 C 中的高精度时间函数。我遇到了 clock_gettime 并在这里阅读了它:

http://man7.org/linux/man-pages/man2/clock_gettime.2.html

我注意到它说:

 Link with -lrt (only for glibc versions before 2.17).

我想知道为什么我可以使用精度较低的时间函数而不需要向我的 gcc 编译行添加任何内容?有没有办法让我以不同的方式使用高精度代码,这样我就不需要在我的编译行上添加任何东西?

我知道我的系统使用的是旧的....旧版本的 glibc,这就是我必须这样做的原因,但我是为了那些无法使用的人(比如我自己)而请求更新 glibc。

代码正在进行中:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{

  int result;
  struct timespec tp;
  clockid_t clk_id;

//  clk_id = CLOCK_REALTIME;
  clk_id = CLOCK_MONOTONIC;
//  clk_id = CLOCK_BOOTTIME;
//  clk_id = CLOCK_PROCESS_CPUTIME_ID;

  // int clock_gettime(clockid_t clk_id, struct timespec *tp);
  result = clock_gettime(clk_id, &tp);
  printf("result: %i\n", result);
  printf("tp.tv_sec: %lld\n", tp.tv_sec);
  printf("tp.tv_nsec: %ld\n", tp.tv_nsec);

  result = clock_getres(clk_id, &tp);
  printf("result: %i\n", result);
  printf("tp.tv_sec: %lld\n", tp.tv_sec);
  printf("tp.tv_nsec: %ld\n", tp.tv_nsec);

}

【问题讨论】:

  • 难道你不应该发布你的 glibc 版本吗?
  • 由于工作相关的原因,我实际上不确定我是否可以,但我知道它比 2.17 旧。这些信息会影响代码的重写方式吗?

标签: c function gcc glibc


【解决方案1】:

无需提及库即可调用的函数位于 libc。链接到此库的 -lc 选项已为您静默添加。

要调用其他库中的函数,您必须在链接命令中添加相应的-l(可能还有-L)选项。这是正常的,你不应该觉得这意味着有问题。

对于哪些函数包含在 libc 中,哪些不包含,没有合理的解释。这只是历史偶然。感谢那些编写手册页的好人,因为他们将必要的链接器选项放在了页面的顶部,这样您就不必寻找它们了。

【讨论】:

  • 这正是我想要的。谢谢!
【解决方案2】:

clock_gettime() 是系统调用的包装器。如果您处于受限环境(librt 不可用),您可以直接使用 syscall() 绕过 libc 包装器。您可以在BusyBox libbb/time.c 中查看示例。

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2020-08-22
    • 1970-01-01
    • 2021-05-25
    • 2010-10-21
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多