如何判断是否使用了glibc

x13*_*13n 26 c c++ glibc

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

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

Eri*_*ler 33

包含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
Run Code Online (Sandbox Code Playgroud)

  • 10秒既不在这里也不在那里.你得到我的投票,包括来自feature.h的片段;) (3认同)
  • 在`2.15`中有一个很好的宏:`__GLIBC_PREREQ(maj, min)`可以为你检查最大值和最小值。但不确定它会恢复多久。 (2认同)
  • 根据ChangeLog.10,`__GLIBC_PREREQ`自1999-06-18以来一直存在-我认为第一个版本是glibc 2.2。 (2认同)

Gun*_*iez 24

有#defines __GNU_LIBRARY__, __GLIBC__在features.h中__GLIBC_MINOR__(我的系统中的6,2和11,glibc-2.11).


R..*_*R.. 5

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

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

  • 对于需要在 Windows 和 iPhone 以及 Linux 目标上构建的项目来说,配置脚本不是一个有用的解决方案。 (2认同)
  • @Joakim - CMake 可能是最糟糕的选择之一。如果他使用 CMake,他将不得不编写自己的测试,configure 将为他执行。我们刚刚删除了 CMake 作为替代方案,因为它太乏力了,创造了很多额外的工作并导致了很多问题。有关问题的详细列表,请参阅 [CMake Removal](https://www.cryptopp.com/wiki/CMake#CMake_Removal)。 (2认同)