我正在尝试为大型框架实现回溯功能,该框架用于不同的平台和操作系统。在其中一些中,它与glibc相关联,而在另一个中,使用了不同的东西(例如uclibc)。 backtrace()函数只存在于前者中。
有没有办法判断是否使用了glibc?任何#define?我无法在glibc手册中找到答案。我知道在编译期间我不能有链接时间信息,但我想包含文件必须有所不同。至少必须在某处声明回溯。 我想检查它而不必强制将显式标志传递给编译器。
答案 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%"
这有点丑陋,语法上也模棱两可,但很有用。