2010-11-24 9 views
21

Ich versuche, Backtrace-Funktionalität für ein großes Framework zu implementieren, das für verschiedene Plattformen und Betriebssysteme verwendet wird. In einigen von ihnen ist es mit Glibc verbunden, während in der anderen etwas anderes (zB uclibc) verwendet wird. Die Funktion backtrace() existiert nur im ersteren.Wie kann ich feststellen, ob glibc verwendet wird?

Gibt es eine Möglichkeit zu sagen, ob Glibc verwendet wird? Irgendein #define? Ich konnte im glibc-Handbuch keine Antwort finden. Ich weiß, dass ich während der Kompilierung keine Verknüpfungszeitinformationen haben kann, aber ich denke, Include-Dateien müssen sich unterscheiden. Mindestens Backtrace muss irgendwo deklariert werden. Ich möchte es überprüfen, ohne gezwungen zu sein, explizite Flags an den Compiler zu übergeben.

Antwort

19

Es ist die #defines __GNU_LIBRARY__ , __GLIBC__ und __GLIBC_MINOR__ (6, 2 und 11 auf meinem System mit glibc-2,11) in features.h.

28

Include features.h, enthält die Makros, die Sie benötigen, z.

#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 Sekunden ist weder hier noch dort. Du bekommst meine Stimme dafür, Snippet von feature.h einzubinden;) –

+0

vielen Dank Shawn! –

+0

Und von mir +1 für einen fairen Verlierer ;-) – hirschhornsalz

4

Makros für Präprozessor Überprüfung ist nicht eine gute Lösung. uClibc und möglicherweise andere libc-Implementierungen definieren Makros, um glibc nachzuahmen (ohne all ihre aufgeblähten Funktionen bereitzustellen), aus den gleichen Gründen, dass alle Browser "Mozilla" in ihren User-Agent-Strings enthalten: kaputte Programme, die glibc erwarten und Lots ausschalten von Features, wenn sie es nicht sehen.

Stattdessen sollten Sie ein Konfigurationsskript schreiben, um nach backtrace zu suchen, und es nur verwenden, wenn es verfügbar ist.

+1

Konfigurieren von Skripts ist keine nützliche Lösung für ein Projekt, das auf Windows- und iPhone- sowie Linux-Zielen aufbauen muss. –

+0

@LoganPickup: Ich verstehe nicht warum nicht. Wenn Sie jedoch darauf bestehen, ein Build-System zu verwenden, das auf diesen Zielen nicht konfiguriert werden kann, können Sie einfach fest codierte configure-Ergebnisse ('config.h', usw.) für sie haben, da es sich im Wesentlichen um einzelne, streng kontrollierte Umgebungen handelt . –

+1

Verwenden Sie CMake für Multi-Plattform-Projekte. Was Sie wollen, ist Systemintrospektion, nicht Skripte per se konfigurieren. CMake macht Multi-Plattform-System Introspektion – Joakim

Verwandte Themen