编写代码的方式是什么,所以库不需要在C中调用?

时间:2016-07-27 17:11:08

标签: c function gcc glibc

我在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);

}

2 个答案:

答案 0 :(得分:4)

您可以在不提及库的情况下调用的函数位于libc中。将为您静默添加链接到此库的-lc选项。

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

对于libc中包含哪些函数以及哪些函数不包含在内,没有合理的解释。这只是历史事故。感谢那些编写手册页以便将必要的链接器选项放在页面顶部的好人,这样你就不必去寻找它们了。

答案 1 :(得分:0)

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