2010-11-24 129 views
21

我正在尝试为大型框架实现回溯功能,该框架用于不同的平台和操作系统。在其中一些中,它与glibc链接,而另一些中则使用了不同的东西(例如uclibc)。 backtrace()函数仅存在于前者中。如何判断是否使用glibc

有什么办法可以判断glibc是否被使用?任何#定义?我无法在glibc手册中找到答案。我知道在编译期间我不能拥有链接时间信息,但我想包含文件必须有所不同。至少回溯必须在某个地方宣布。 我想检查它而不必强制将明确的标志传递给编译器。

回答

19

有#定义__GNU_LIBRARY__ __GLIBC__ (在我的系统6,2和11用glibc-2.11) __GLIBC_MINOR__在features.h。

28

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

10秒钟既不在这里,也不在那里。你得到我的投票包括feature.h;) – 2010-11-24 12:09:51

+0

谢谢很多肖恩! – 2010-11-24 12:12:57

4

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

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