如何判断是否使用了glibc

我正在尝试为大型框架实现回溯function,该框架用于不同的平台和操作系统。 在其中一些中,它与glibc相关联,而在另一个中,使用了不同的东西(例如uclibc)。 backtrace()函数仅存在于前者中。

有没有办法判断glibc是否被使用? 任何#define? 我无法在glibc手册中找到答案。 我知道在编译期间我不能有链接时间信息,但我想包含文件必须有所不同。 至少必须在某处声明回溯。 我想检查它而不必强制将显式标志传递给编译器。

features.h中#define __GNU_LIBRARY ____ GLIBC____GLIBC_MINOR__ (在我的系统中使用glibc-2.11为6,2和11)。

包含features.h,它包含您需要的宏,例如

#define __GNU_LIBRARY__ 6 /* Major and minor version number of the GNU C library package. Use these macros to test for features in specific releases. */ #define __GLIBC__ 2 #define __GLIBC_MINOR__ 4 

检查预处理器宏不是一个好的解决方案。 uClibc和可能的其他libc实现定义了模仿glibc的宏(没有提供所有膨胀的function),原因与所有浏览器在其User-Agent字符串中都包含“Mozilla”的原因相同:破坏的程序期望看到glibc并关闭批量function,如果他们没有看到它。

相反,您应该编写一个配置脚本来探测backtrace并仅在它可用时才使用它。