我正在尝试为大型框架实现回溯功能,该框架用于不同的平台和操作系统。在其中一些中,它与glibc链接,而另一些中则使用了不同的东西(例如uclibc)。 backtrace()函数仅存在于前者中。如何判断是否使用glibc
有什么办法可以判断glibc是否被使用?任何#定义?我无法在glibc手册中找到答案。我知道在编译期间我不能拥有链接时间信息,但我想包含文件必须有所不同。至少回溯必须在某个地方宣布。 我想检查它而不必强制将明确的标志传递给编译器。
我正在尝试为大型框架实现回溯功能,该框架用于不同的平台和操作系统。在其中一些中,它与glibc链接,而另一些中则使用了不同的东西(例如uclibc)。 backtrace()函数仅存在于前者中。如何判断是否使用glibc
有什么办法可以判断glibc是否被使用?任何#定义?我无法在glibc手册中找到答案。我知道在编译期间我不能拥有链接时间信息,但我想包含文件必须有所不同。至少回溯必须在某个地方宣布。 我想检查它而不必强制将明确的标志传递给编译器。
有#定义__GNU_LIBRARY__ , __GLIBC__ (在我的系统6,2和11用glibc-2.11)和 __GLIBC_MINOR__在features.h。
包含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的宏(没有提供所有的臃肿功能),其原因与所有浏览器在其User-Agent字符串中包含“Mozilla”的原因大致相同:希望看到glibc并关闭批次的损坏程序的功能,如果他们没有看到它。
相反,您应该编写一个配置脚本来探测backtrace
并仅在可用时才使用它。
10秒钟既不在这里,也不在那里。你得到我的投票包括feature.h;) – 2010-11-24 12:09:51
谢谢很多肖恩! – 2010-11-24 12:12:57