2010-11-24 47 views
21

異なるプラットフォームとOSに使用される大きなフレームワークに対してバックトレース機能を実装しようとしています。それらの中にはglibcとリンクしているものもあれば、別のもの(例えばuclibc)が使われているものもあります。 backtrace()関数は前者にのみ存在します。glibcが使用されているかどうかを確認する方法

glibcが使用されているかどうかを確認する方法はありますか?任意の#define?私はglibcのマニュアルで答えを見つけることができませんでした。私はコンパイル時にリンク時情報を持つことができないことを知っていますが、インクルードファイルは異なっていなければなりません。少なくともバックトレースはどこかで宣言する必要があります。 コンパイラに明示的なフラグを強制的に渡さずにチェックしたいと思います。

答えて

19

(のglibc-2.11と私のシステム上の6,2及び11)の#define __GNU_LIBRARY__ __GLIBC__ __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からスニペットを含むことに私の投票を得る;) –

+0

多くのおかげでショーン! –

+0

そして、私からは公正な敗者のために+1; – hirschhornsalz

4

良い解決策ではありません。 uClibcやその他のlibc実装では、すべてのブラウザがUser-Agent文字列に "Mozilla"を含むのと同じ理由でglibcを模倣するマクロを定義しています(glibcを見て、彼らはそれを見ていない場合、機能の。

代わりに、backtraceのプローブを行うconfigureスクリプトを作成し、使用可能な場合にのみ使用してください。

+1

設定スクリプトは、WindowsとiPhoneだけでなくLinuxターゲットでビルドする必要があるプロジェクトにとっては便利なソリューションではありません。 –

+0

@LoganPickup:なぜそうは見えないのですか?しかし、それらのターゲットで設定できないビルドシステムを使用することを主張するならば、それらが本質的に単一で厳密に制御された環境であるため、ハードコードされた設定結果( 'config.h'など) 。 –

+1

マルチプラットフォームプロジェクトにCMakeを使用します。あなたが望むのは、スクリプトそのものを構成するのではなく、システムイントロスペクションです。 CMakeはマルチプラットフォームのシステムイントロスペクションを行います – Joakim

関連する問題