2010-11-24 6 views
21

J'essaye d'implémenter la fonctionnalité de traçage pour un grand cadre, qui est employé pour différentes plates-formes et OS'es. Dans certains d'entre eux, il est lié à la glibc, tandis que dans l'autre, quelque chose de différent (par exemple, uclibc) est utilisé. La fonction backtrace() n'existe que dans la première.Comment dire si la glibc est utilisée

Y at-il un moyen de dire si la glibc est utilisée? Tout #define? J'étais incapable de trouver une réponse dans le manuel de la glibc. Je sais que je ne peux pas avoir d'informations sur les temps de connexion pendant la compilation, mais je suppose que les fichiers doivent différer. Au moins backtrace doivent être déclarés quelque part. Je voudrais le vérifier sans être obligé de passer des drapeaux explicites au compilateur.

Répondre

19

Il y a les #defines __GNU_LIBRARY__ , __GLIBC__ et __GLIBC_MINOR__ (6, 2 et 11 sur mon système avec glibc-2.11) dans features.h.

28

Inclut features.h, il contient les macros dont vous avez besoin, par ex.

#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 secondes n'est ni ici ni là. Vous obtenez mon vote pour inclure l'extrait de feature.h;) –

+0

merci beaucoup Shawn! –

+0

Et de moi +1 pour être un perdant juste ;-) – hirschhornsalz

4

Vérification des macros préprocesseur est pas une bonne solution. uClibc et éventuellement d'autres implémentations de libc définissent des macros pour imiter glibc (sans fournir toutes ses fonctionnalités) pour les mêmes raisons que tous les navigateurs incluent "Mozilla" dans leurs chaînes User-Agent: programmes cassés qui attendent de voir la glibc et éteignent beaucoup de fonctionnalités si elles ne le voient pas. Au lieu de cela, vous devez écrire un script de configuration pour tester backtrace et l'utiliser uniquement s'il est disponible.

+1

Les scripts de configuration ne sont pas une solution utile pour un projet qui doit être construit sur Windows et iPhone ainsi que sur des cibles Linux. –

+0

@LoganPickup: Je ne vois pas pourquoi pas. Mais si vous insistez sur l'utilisation d'un système de construction qui ne peut pas être configuré sur ces cibles, vous pouvez simplement avoir des résultats de configuration codés en dur ('config.h', etc.) car ils sont essentiellement des environnements uniques et étroitement contrôlés. . –

+1

Utilisez CMake pour les projets multi plates-formes. Ce que vous voulez, c'est l'introspection du système, pas la configuration des scripts en soi. CMake fait l'introspection de système multi plate-forme – Joakim

Questions connexes