2012-08-26 21 views
9

Digamos que encuentro una muy buena biblioteca de código abierto en Internet y ahora quiero usarla para mi propio proyecto.incluyendo encabezados externos descubriendo las opciones del compilador

lo descargo, posiblemente compilarlo y obtener los archivos de cabecera & la biblioteca estática/dinámica.

Así que empezar a escribir mis propios archivos de origen y, por supuesto, cuando quiero utilizar la funcionalidad de esta biblioteca externa incluyo las cabeceras derecha de la misma en mis archivos de origen.

Ahora puedo compilar mi archivo de origen, asegúrese de que la incluyen rutas de acceso y opciones de enlazador para esta biblioteca externa sean correctas.

Y me llegan montones de errores, todos provenientes de los encabezados externos. Resulta que requieren algunos indicadores del compilador.

¿Cómo averiguo los indicadores de compilación mínima que tengo que configurar (para poder compilar encabezados desde una biblioteca externa)?

Lo que he pensado en ello hasta ahora:

  1. buscarlas en el guión construcción de la fuente (puede ser bastante difícil, ya que hay muchos lugares donde pueden ser definidos y pueden no ser las banderas mínimos, ya que pueden ser necesarios para todas las cabeceras juntos, pero no para los específicos que utilizo)
  2. Google cada mensaje de error y es de esperar que va a dar la respuesta (puede ser duro con una gran cantidad de mensajes de error y google podría no saber la respuesta, o podría no saber las palabras clave correctas para encontrar la respuesta)
  3. Quizás algunos cómo 'incluir' el script de compilación de la biblioteca externa en mi propio proyecto (podría ser muy difícil, ya que podría querer usar un sistema de compilación diferente y probablemente tendría que entender completamente el sistema de compilación, lo que podría ser difícil para bibliotecas más grandes)
+0

esto parece que generalmente es un problema del sistema de compilación? ¿Por qué incluye el otro código fuente en su proyecto en lugar de usar el otro sistema de construcción de proyectos? Sé que los sistemas de compilación son un dolor en el trasero, pero para eso están hechos. – Alex

+0

Solo incluyo los encabezados del otro proyecto. No sé cómo se supone que debo usar las definiciones c/++ del otro proyecto sin los encabezados. – DevBen

Respuesta

1

Cualquier buen comportamiento de la biblioteca barcos de código abierto con instrucciones sobre cómo utilizar sus archivos de desarrollo. En GNU/sistemas de Linux, es habitual tener pkg-config archivos (* .pc) instalados junto a los encabezados y bibliotecas de desarrollo, en cuyo caso pkg-config --cflags library-name le dirá acerca de las opciones de compilación necesarias.

Dónde pkg-config se puede utilizar, es sólo una cuestión de diciéndole al sistema de construcción qué componentes le gustaría importar, por ejemplo, en autotools.

PKG_CHECK_MODULES([DEPS], [libname]) 

Y a continuación, utilice las variables DEPS_CFLAGS y DEPS_LIBS en los archivos .am.

E.g. en una cáscara de línea de comandos:

$ gcc $(pkg-config --cflags libname) -c main.c 
$ gcc $(pkg-config --libs libname) main.o -o test.exe 

De todos modos, sería más productivo si puede publicar información específica acerca de la biblioteca se utiliza y cuáles son los errores que se generan.

+0

oh wow, ni siquiera sabía sobre pkg-config, pero eso suena como una gran solución. ¿Es pkg-config muy popular entre los proyectos de código abierto más populares? ¿No tiene ningún consejo sobre una estrategia que alguien podría usar en caso de que no haya una buena documentación sobre los indicadores de compilación necesarios para los archivos de encabezado? – DevBen

+0

sí, 'pkg-config' puede considerarse un * estándar de facto * entre los proyectos de FOSS. No estoy seguro de haber entendido la pregunta sobre la estrategia, pero generalmente hay un mecanismo en el sistema de compilación para declarar los archivos * .pc o simplemente puede sustituir la salida de 'pkg-config --cflags libname' en una línea de comando. – milton

0

Para un encabezado, es muy raro tener errores sobre los indicadores del compilador o es muy fácil resolverlo en ese encabezado (por ejemplo, usando #ifdef .. # endif o intentar volver escribe una parte del código usando un patrón más conocido).

pero lo más posible error es algo como esto: Usted incluir un encabezado directamente, sino que la cabecera depende de alguna otra cabecera (posiblemente de sistema o de la misma biblioteca) y que se olvide de incluir antes principal archivo de inclusión (en realidad esto. es un archivo común entre los programadores que se olvidan de hacer que sus encabezados sean independientes, simplemente se olvidan de incluir todos los encabezados requeridos de su archivo en el orden correcto en el archivo principal de inclusión).

Para comprobar este criterio, busque en el código fuente de la biblioteca (que dice que está compilado correctamente). vea lo que se incluye antes del archivo de inclusión principal y puede encontrar que su archivo de inclusión depende de los archivos de inclusión incluidos antes.

Por ejemplo, tanto en MSVC como en GCC puede usar encabezados precompilados y cualquier inclusión en los encabezados precompilados se incluirá automáticamente en todos los archivos fuente que lo incluyen, por lo que si olvida agregar algo en uno de sus encabezados públicos e incluye en su encabezado precompilado su código se compilará correctamente, pero si alguien incluye su encabezado público obtendrá un error.

o si se define algo en private_header_1.h y lo utilizan en su cabecera pública y luego en el archivo de origen (por ejemplo impl.cpp que dicen: # include "private_header_1.h" # include 'public_header.h' de nuevo su código se compila correctamente, pero incluyendo public_header.h en otro código generará un error

+0

Preferiría evitar tener que usar #ifdef ... # endif y volver a escribir partes del código. Creo que tienes un buen punto con el orden de inclusión del encabezado, supongo que las cosas pueden salir mal allí también. Sin embargo, estoy realmente más interesado en resolver problemas relacionados con los indicadores del compilador. Y estoy un poco inseguro acerca de los encabezados precompilados: cómo funcionan, si son una buena opción ... – DevBen

+0

@ deaf7 los encabezados precompilados son tan encantadores que pueden reducir significativamente el tiempo de compilación. Incluirá encabezados estables (como encabezados de sistema o encabezados estándar de C++) en pch y luego el compilador los compilará solo una vez, no en cada unidad de C++ que compila y funciona muy bien tanto en MSVC como en GCC. pero aquí no digo usar #ifdef .. # endif o pch, en su lugar digo que tal vez la biblioteca tiene pch o invalid include order que causa el problema – BigBoss

Cuestiones relacionadas