¿Puede un enlace C ++ biblioteca estática a la biblioteca compartida?
-
12-09-2019 - |
Pregunta
Decir que tengo un C ++ estática lib, static.lib y quiero llamar a algunas funciones de una librería compartida C ++, por ejemplo shared.lib. ¿Es posible?
Supongamos ahora que tengo otra librería compartida, digo shared2.lib que enlaza con static.lib pero no está asociada al shared.lib. ¿El enlazador enlazar automáticamente a shared2.lib shared.lib en este caso?
Estoy utilizando Microsoft Visual Studio 2003.
Solución
bibliotecas estáticas no están vinculados. Ellos son sólo una colección de archivos de objetos (* .obj o * .o) que se archivan juntos en un archivo de biblioteca (un poco como un archivo tar / zip) para que sea más fácil para el enlazador para encontrar los símbolos que necesita.
Un lib estática puede llamar a funciones que no están definidos (pero se declaran sólo en un fichero de cabecera), ya que sólo se compila. A continuación, cuando se vincula un exe o DLL que utiliza el lib estática, tendrá que enlazar con otra biblioteca que proporciona la llama de la lib estática pero no definida en el mismo.
Si desea que el enlazador automáticamente enlace Otro bibliotecas sugerencia de Stephen trabajarán y es utilizado por las bibliotecas de muy buena reputación como impulso y STLport. Para ello puso el pragma en el archivo de encabezado principal para la biblioteca estática. Debe incluir la biblioteca estática y sus dependientes.
Sin embargo OMI esta característica sirve realmente para los escritores de la biblioteca, donde la biblioteca está en la ruta de la biblioteca sistema para que el enlazador encontrarlo fácilmente. También en el caso del impulso y STLport que utilizan esta característica para soportar múltiples versiones de las mismas bibliotecas con las opciones definidas con #define
s donde las diferentes opciones requieren diferentes versiones de la biblioteca para ser vinculado. Esto significa que los usuarios tienen menos probabilidades de configurar impulso de una manera y con una biblioteca de enlace configurado otro.
Mi preferencia por código de aplicación es vincular explícitamente las piezas necesarias.
Otros consejos
El enlazador no traerá automáticamente en las otras bibliotecas, pero se puede usar comentario #pragma (lib, "static.lib") para simplificar el proceso de vincular los archivos adicionales mediante la adición de la pragma a sus archivos de cabecera.
Decir que tengo un C ++ lib estática, static.lib y quiero llamar a algunos funciones de C ++ compartían lib, dicen shared.lib. ¿Es posible?
Sí, por ejemplo, cuando se llama a las funciones de Windows desde dentro de su lib estática que son normalmente de alguna biblioteca dinámica por lo que no debería haber ninguna diferencia.
Supongamos ahora que he compartido otro lib, shared2.lib decir que enlaza con static.lib pero no se vincula a shared.lib. ¿El enlazador vincular de forma automática a shared2.lib shared.lib en este caso?
Tener dependencias como éste podría causar problemas más adelante, sugeriría que en vez de cargar dinámicamente las bibliotecas usando LoadLibrary () , de esa manera no es necesario hacer un seguimiento de dichas dependencias durante la compilación / enlace.