如何让C++11 std::chrono调用clock_gettime()而非_gettimeofday()?
结合你的场景(GCC 8.3 + newlibc),除了已添加的编译宏和函数实现,以下几点可能是你遗漏的:
确保预编译宏在标准库头文件前生效
这些_GLIBCXX_*和_POSIX_*宏必须在包含<chrono>或其他C++标准库头文件之前定义。可以在代码中添加验证代码:#ifdef _GLIBCXX_USE_CLOCK_MONOTONIC #warning "GLIBCXX_USE_CLOCK_MONOTONIC is enabled" #endif编译时如果能看到警告,说明宏定义时机正确。
开启newlibc的POSIX定时器支持
newlibc默认未完全启用POSIX定时器特性,需要在编译newlibc时添加--enable-newlib-posix-timers配置选项,确保<time.h>中能导出CLOCK_MONOTONIC、CLOCK_REALTIME等常量,以及clock_gettime的函数声明。如果头文件中没有这些定义,即使你自己实现了函数,libstdc++也不会选择它。验证libstdc++的分支逻辑
查看本地libstdc++的<chrono>头文件(路径通常为交叉编译前缀下的include/c++/8/chrono),确认其中存在针对_GLIBCXX_USE_CLOCK_MONOTONIC和_GLIBCXX_USE_CLOCK_REALTIME的分支,在宏定义生效时会调用clock_gettime而非gettimeofday。确认链接符号优先级
使用nm工具检查最终二进制文件的符号表:nm your_application | grep clock_gettime确保输出的是你自己实现的
clock_gettime符号,而非newlibc默认提供的版本。如果链接顺序有问题,需要调整LIB_NAMES的顺序,让你的自定义库在系统c库之前被链接。适配
clock_settime的实现(若需修改系统时间)
如果你需要使用std::chrono::system_clock的时间修改功能,要确保clock_settime的实现符合libstdc++的要求,比如正确处理CLOCK_REALTIME时钟的参数格式。
内容的提问来源于stack exchange,提问作者ConicalSine

