如何判断是否使用了glibc

时间:2010-11-24 11:44:53

标签: c++ c glibc

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

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

5 个答案:

答案 0 :(得分:31)

包含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

答案 1 :(得分:22)

有#defines __ GNU_LIBRARY __ __ GLIBC __ <在feature.h中使用/ strong> __ GLIBC_MINOR __ (我的系统中使用glibc-2.11的6,2和11)。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

根据经验,以下两个代码都可以在GCC 6.4上编译并正常运行:

#include <stdio.h>

int main(void) {
#ifdef __GLIBC__
    puts("__GLIBC__");
#endif
    return 0;
}

和:

int main(void) {
#ifdef __GLIBC__
    puts("__GLIBC__");
#endif
    return 0;
}

但只有第一个会产生输出。

这必须表示__GLIBC__来自stdio.h,其中必须包括features.h,另请参见:What is the purpose of features.h header?

因此,严格来说,__GLIBC__本身并不能明确表明已使用glibc,因为即使没有标头,GCC也已经embeds runtime objects such as crt1.o in the finale executable,而这些标头来自glibc。

因此,主要遗漏的问题是:glibc是否保证features.h包含在每个标头中?我找不到清晰的文档报价。待办事项。

答案 4 :(得分:0)

"%Input%"

这有点丑陋,语法上也模棱两可,但很有用。