2010-11-24 16 views
21

Estoy tratando de implementar la funcionalidad backtrace para un marco grande, que se usa para diferentes plataformas y sistemas operativos. En algunos de ellos, está vinculado a glibc, mientras que en el otro se usa algo diferente (p. Ej., Uclibc). la función backtrace() existe solo en el primero.Cómo saber si se usa glibc

¿Hay alguna forma de saber si se usa glibc? Cualquier #define? No pude encontrar una respuesta en el manual de glibc. Sé que no puedo tener información de tiempo de enlace durante la compilación, pero supongo que los archivos de inclusión deben diferir. Al menos, la traza inversa debe declararse en algún lugar. Me gustaría comprobarlo sin tener que pasar banderas explícitas al compilador.

Respuesta

19

Hay los #defines __GNU_LIBRARY__ , __GLIBC__ y __GLIBC_MINOR__ (6, 2 y 11 en mi sistema con glibc-2.11) en features.h.

28

Incluya features.h, contiene las macros que necesita, p. Ej.

#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 segundos no está ni aquí ni allá. Obtendrá mi voto para incluir el fragmento de feature.h;) –

+0

muchas gracias Shawn! –

+0

Y de mí +1 por ser un perdedor justo ;-) – hirschhornsalz

4

Comprobación de macros del preprocesador es no una buena solución. uClibc y posiblemente otras implementaciones de libc definen macros para imitar a glibc (sin proporcionar toda su funcionalidad inflada) por las mismas razones por las que todos los navegadores incluyen "Mozilla" en sus cadenas User-Agent: programas rotos que esperan ver glibc y apagar lotes de características si no lo ven.

En su lugar, debe escribir un script de configuración para buscar backtrace y usarlo solo si está disponible.

+1

Las secuencias de comandos de configuración no son una solución útil para un proyecto que necesita compilarse en Windows, iPhone y objetivos de Linux. –

+0

@LoganPickup: No veo por qué no. Pero si insistes en usar un sistema de compilación que no sea configurable para esos objetivos, puedes tener los resultados de configuración codificados ('config.h', etc.) para ellos, ya que son esencialmente entornos únicos, estrechamente controlados. . –

+1

Use CMake para proyectos multiplataforma. Lo que desea es introspección del sistema, no configurar scripts per se. CMake hace una introspección de sistema multiplataforma – Joakim

Cuestiones relacionadas