2010-11-24 131 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並僅在可用時才使用它。