我正在嘗試爲大型框架實現回溯功能,該框架用於不同的平臺和操作系統。在其中一些中,它與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