2009-08-07 17 views
14

Digamos que tengo una biblioteca estática de C++, static.lib y quiero llamar a algunas funciones de una biblioteca compartida de C++, digamos shared.lib. ¿Es posible?¿Puede un enlace de biblioteca estática de C++ a la biblioteca compartida?

Supongamos ahora que tengo otra lib compartida, digamos shared2.lib que enlaza con static.lib pero no enlaza con shared.lib. ¿El enlazador vincula automáticamente shared2.lib a shared.lib en este caso?

Estoy utilizando Microsoft Visual Studio 2003.

Respuesta

22

Las bibliotecas estáticas no están vinculadas. Son solo una colección de archivos de objeto (* .obj o * .o) que se archivan juntos en un archivo de biblioteca (algo así como un archivo tar/zip) para facilitar al vinculador encontrar los símbolos que necesita.

Una lib estática puede llamar a funciones que no están definidas (pero que solo se declaran en un archivo de encabezado), ya que solo se compila. Luego, cuando vincula un exe o dll que usa la lib estática, tendrá que vincularse con otra biblioteca que proporcione la llamada desde la lib estática pero no definida en ella.

Si desea que el enlazador enlace automáticamente otras bibliotecas, la sugerencia de Stephen funcionará y es utilizada por bibliotecas de gran reputación como boost y stlport. Para hacer esto, coloque el pragma en el archivo de encabezado principal para la biblioteca estática. Debe incluir la biblioteca estática y sus dependientes.

Sin embargo, esta función de IMO está destinada a los escritores de librerías, donde la biblioteca se encuentra en la ruta de la biblioteca del sistema para que el vinculador la pueda encontrar fácilmente. También en el caso de boost y stlport utilizan esta característica para admitir versiones múltiples de las mismas bibliotecas con opciones definidas con #define s donde diferentes opciones requieren diferentes versiones de la biblioteca para vincularse. Esto significa que es menos probable que los usuarios configuren el impulso de una manera y el enlace con una biblioteca configurada de otra manera.

Mi preferencia por el código de la aplicación es vincular explícitamente las piezas necesarias.

6

El enlazador no traerá automáticamente en las otras bibliotecas, pero se puede usar #pragma comment (lib, "static.lib") para simplificar el proceso de vincular los archivos adicionales mediante la adición de la pragma a sus archivos de cabecera.

0

decir que tengo un C++ lib estática, static.lib y quiero llamar a algunos funciones de una librería compartida C++, por ejemplo shared.lib. ¿Es posible?

Sí, por ejemplo, cuando llama a las funciones de Windows desde su lib estática, normalmente provienen de alguna biblioteca dinámica, por lo que no debería haber diferencia.

Supongamos ahora que tengo otra compartida lib, digo shared2.lib que enlaza con static.lib pero no está asociada al shared.lib. ¿El enlazador vincula automáticamente shared2.lib a shared.lib en este caso?

Tener dependencias como éste podría causar problemas más adelante, yo sugeriría que en vez de cargar dinámicamente las bibliotecas utilizando LoadLibrary(), de esa manera no es necesario hacer un seguimiento de dichas dependencias durante la compilación/enlace.

+0

Acepto que debe tener cuidado con las dependencias de la biblioteca, pero creo que LoadLibrary es excesivo en este caso.Solo lo he requerido para arquitecturas tipo plugin. – iain

Cuestiones relacionadas