2010-10-25 15 views
8

Estoy tratando de comprender cómo usar bibliotecas no estándar en mis proyectos de C++. Tengo algunas preguntas.Vinculación de C++ a bibliotecas con makefile (newbe)

Digamos que quiero usar la biblioteca POCO. Así que lo descargué y lo construí usando make (build estática). Ahora tengo muchos archivos .o y .h. Hay un archivo Path.h y un archivo Path.o en directorios diferentes.

Ahora quiero utilizar este módulo en mi código. Entonces incluyo el archivo usando #include "Poco/Path.h". ¿Debo modificar makefile y agregar Path.o a mi destino?

¿Qué sucede cuando uso la biblioteca estándar? ¿Están disponibles solo en archivos de encabezado? Sé que ese código de plantilla no puede ser precompilado. Qué pasa con el resto ?

Respuesta

10

Además de los archivos .h y .o, es probable que también tenga uno o más archivos libXXX.a y/o libXXX.so. Estos son los archivos de la biblioteca real que su aplicación debe vincular.

Para utilizar la biblioteca, incluya los encabezados relevantes en su archivo de origen y cambie su archivo MAKE para decirle al vinculador que también debe vincular su aplicación a la biblioteca XXX. El comando de enlazador típico para eso es -lXXX y el enlazador buscará tanto libXXX.a como libXXX.so y usará el que parezca más apropiado.

La biblioteca estándar no es realmente diferente de las bibliotecas externas, excepto que no tiene que especificarla explícitamente al vinculador.

+0

Entonces, ¿un archivo es una biblioteca estática y .so es dinámico/compartido? – Seba

+0

@Seba: Sí, eso es correcto. –

+0

Muchas gracias :) – Seba

8

Su pregunta parece implicar que ya tiene un archivo MAKE para su propio código. Si ese es el caso, entonces sí, debe modificar la regla para su ejecutable en ese archivo MAKE. Como señala Bart van Ingen Schenau, el archivo MAPA de POCO probablemente ensambló los archivos de objetos en bibliotecas como Poco/Libraries/libPoco.a, por lo que debe usarlas en lugar de tratar de seleccionar los archivos objeto que necesita. Por ejemplo, si en este momento la regla dice lo siguiente:

foo: foo.o bar.o 
    g++ -lSomeLibrary $^ -o [email protected] 

se debe cambiar a

foo: foo.o bar.o 
    g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o [email protected] 

(La segunda parte de su pregunta, es "lo que pasa ... ¿Qué pasa con el resto?" no está claro para mí.)

Nota: Es una mala idea #include "Poco/Path.h". Esto hace que el código dependa de una estructura de directorio, algo que no debería importar. Es mucho mejor que #include "Path.h" y decirle al compilador dónde encontrarlo: g++ -c -IPoco ....

Cuestiones relacionadas