可以用什么方式编写代码,以便不需要在 C 中调用库?
What way can code be written so libraries don't need to be called in C?
我正在探索 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);
}
无需提及库即可调用的函数位于 libc 中。此库 link 的 -lc
选项已悄悄为您添加。
要调用其他库中的函数,您必须在 linking 命令中添加相应的 -l
(可能还有 -L
)选项。这是正常的,你不应该觉得这意味着有什么不对劲。
对于哪些函数包含在 libc 中,哪些不包含,没有合理的解释。这只是历史的偶然。感谢编写手册页的好心人,他们将必要的 linker 选项放在页面顶部,这样您就不必寻找它们了。
clock_gettime() 是系统调用的包装器。如果您处于受限环境中(librt 不可用),您可以直接使用 syscall() 来绕过 libc 包装器。您可以在 BusyBox libbb/time.c.
中查看示例
我正在探索 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);
}
无需提及库即可调用的函数位于 libc 中。此库 link 的 -lc
选项已悄悄为您添加。
要调用其他库中的函数,您必须在 linking 命令中添加相应的 -l
(可能还有 -L
)选项。这是正常的,你不应该觉得这意味着有什么不对劲。
对于哪些函数包含在 libc 中,哪些不包含,没有合理的解释。这只是历史的偶然。感谢编写手册页的好心人,他们将必要的 linker 选项放在页面顶部,这样您就不必寻找它们了。
clock_gettime() 是系统调用的包装器。如果您处于受限环境中(librt 不可用),您可以直接使用 syscall() 来绕过 libc 包装器。您可以在 BusyBox libbb/time.c.
中查看示例