2012-08-30 9 views
16

Mi historial es C# pero tengo que mantener algo de legacy (MS) C++. En esa base de código me topé con:C++: ¿Qué hace #pragma comment (lib, "XXX") con "XXX"?

#pragma comment(lib, "OtherLib700.lib") 

donde 700 hay algunas versiones. Además, lib es una DLL con el mismo nombre.

Primero pensé que el programa dependería de la DLL pero después de eliminarlo del sistema el programa aún funciona. Sin embargo, existe una versión más reciente de la DLL, que se denomina OtherLib900 ...

Parece que el programa 'incluyó' el código de la lib para que ya no dependa de la DLL externa. (O que el programa 'automáticamente' usa la DLL más nueva ...)

¿Cuál es correcto? ¿Hay alguna manera de confirmar aún más esa 'suposición'?

+3

Downvoted para aceptar la respuesta incorrecta. – rustyx

Respuesta

3

Si un programa tiene este pragma, buscará la biblioteca OtherLib700.lib. Si se trata de una biblioteca de importación cuando se carga el programa, Windows buscará OtherLib700.dll en la ruta. No intentará buscar OtherLib900.dll durante la ejecución, por lo que debe encontrar su dll en una carpeta diferente. Esto supone que OtherLib700.lib es una biblioteca de importación y no una biblioteca estática. Si OtherLib700 es una biblioteca estática, eso es todo lo que necesita.

+0

Sí 700 normalmente habrá algunas versiones, sin embargo, Windows buscará una coincidencia exacta y no intentará cargar una biblioteca con versiones superiores con el mismo nombre. – drescherjm

+0

¿Cómo sabré si la otra lib es una importación o una biblioteca estática? Entonces, si es estático, ¿su código está incluido en "mi" programa? – steglig

+1

Creo que la respuesta a continuación describe cómo diferenciar: http://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import – drescherjm

33

Ese pragma se utiliza para vincular con el archivo .lib especificado. Esta es una alternativa a la especificación de la biblioteca en el campo de dependencias externas en la configuración del proyecto.

Sobre todo, se usa para soportar diferentes versiones:

#ifdef USE_FIRST_VERSION 
#pragma comment(lib, "vers1.lib") 
#else 
#pragma comment(lib, "vers2.lib") 
#endif 

Cuando la aplicación utiliza una biblioteca de enlace dinámico-, un archivo lib le indica información sobre qué símbolos se exportan en el dll. Así que, básicamente, solo necesita el lib para compilar el enlace &, pero necesita el dll para ejecutar el programa, ya que contiene todo el código binario.

Dice que hay un asociado dll, que generalmente indica que el archivo lib solo contiene información de enlace y no tiene código. Debería obtener un error en tiempo de ejecución si no se encontró el dll asociado. Puede verificar con MSVS si se cargó una versión diferente del dll o si se cargó desde un lugar diferente.

+0

* "Solo necesita lib para compilar y vincular" * ... ¿entonces la lib puede ser como una alternativa a un archivo de encabezado (.h)? – Acidic

-2

Si el .lib es una lib "real" con el código real (nunca he usado DLL salvo los proporcionados por el sistema, pero creo que usted hace 'importar libs' para sus propias DLL), entonces DLL no es requerido.

En cuanto al tema, #pragma comment (lib, xxx) permite a los programas agregar ciertas opciones para el enlazador. Puede ser muy útil, aunque me he perdido algunas opciones que me hubiera gustado agregar así. El ejemplo que se da es un buen ejemplo para su uso: cuando el archivo objeto se incluye en el programa, también se agrega la lib especificada.

+2

¿Qué es una lib "real"? –

+0

Creo que se refería a la biblioteca "estática". – moala

Cuestiones relacionadas