2009-02-20 11 views
10

Agregué un proyecto dll a mi solución y lo referenciaba explícitamente mediante un proyecto ejecutable. El ejecutable se queja de que no puede encontrar la lib.Archivo .lib no creado (VS2008)

¿Alguna idea de cómo configurar el proyecto para crear el archivo lib requerido? ¿Y quizás por qué el proyecto no crearía uno?!?

Saludos

NOTA he buscado el proyecto y el archivo no se está creando en cualquier lugar.

Respuesta

12

En el Enlazador -> pestaña de propiedad Avanzada del proyecto DLL, verifique que el valor para Importar Biblioteca (el archivo .lib que está buscando) es correcto/razonable. El valor de esta propiedad determinará el nombre de la biblioteca de importación y dónde lo escribirá el vinculador.

También puede necesitar generar un archivo de definición de importaciones (.def) en su proyecto, o verificar los archivos de encabezado y asegurarse de que las funciones exportadas estén etiquetadas con el calificador __declspec (dllexport) en el archivo de encabezado. Esto normalmente se activan y desactivan mediante un # define como:

#ifdef MYAPI_EXPORTS 
#define MYAPI_API __declspec(dllexport) 
#else 
#define MYAPI_API __declspec(dllimport) 
#endif 

void MYAPI_API foo(int bar); 

Básicamente desea que el compilador para ver dllexport cuando se está construyendo la biblioteca, pero dllimport cuando su código de cliente se #including el archivo de cabecera. Si Visual Studio generó la estructura básica del proyecto, probablemente ya haya creado un #define adecuado para usar.

No es necesario que ambos creen el archivo .def y agreguen el dllexport, solo uno u otro. Yo prefiero este último Además, si elige usar un archivo .def, debe especificarlo en las propiedades de Enlazador de su proyecto de biblioteca.

+0

El valor se establece en $ (TargetDir) $ (TargetName) .lib que es el mismo valor que otros dlls que tengo en el proyecto que sí funcionan. –

+0

Eso es realmente extraño, ¿puedes agregar manualmente el interruptor de la línea de comando (en la hoja de propiedades de la línea de comandos) para especificar la biblioteca de importación? Como /IMPLIB:C:\MyDll.lib? – Jeremy

+0

Agregué ese cambio tanto a la línea de comando del enlazador como a la línea de comando del compilador y no se ha creado el archivo especificado ... ¡simplemente se está negando a crear una lib!?! –

1

Incluyó el archivo lib en Project Properties-> Linker-> Input sheet en Exe Project.

Y también asegúrese de haber incluido las referencias adicionales en la pestaña Enlazador.

+0

Lo hice :( pero como no se está creando, este es un punto de silencio? –

+0

Si el compilador arroja algún error al compilar un archivo lib? Compruebe la ubicación $ (OutDir) \ $ (ProjectName) para lib – Vinay

+0

No se generan errores (excepto el que se queja de que el archivo lib no existe) y la lib no existe en ningún lugar del proyecto. –

1

Compruebe el proyecto que crea la DLL. Si no está produciendo una .lib, probablemente no se lo haya indicado. Puede cambiar el resultado del proyecto de una DLL a una biblioteca estática en Propiedades-> General-> Tipo de configuración (elija Biblioteca estática .lib)

+0

Estás asumiendo que puedo/quiero cambiar el tipo de proyecto. Tengo entendido que los dll (que no están vinculados dinámicamente) TIENEN que crear libs. De lo contrario, son inútiles? –

+0

Si ese es el caso, entonces sus propiedades siguen siendo incorrectas. Debes verificar a dónde va tu archivo .lib. Si eso es todo lo que ocurre, compruebe Propiedades-> Enlazador-> Importar biblioteca, y vea dónde está creando su archivo lib. –

+0

se establece en $ (TargetDir) $ (TargetName) .lib que es la misma configuración que otros dlls en la solución que funcionan bien. –

4

Lo he visto antes. Y, de hecho, acaba de golpear es de nuevo recientemente. Un archivo .lib no se crea si no se exporta nada. La exportación de funciones ocurre de dos maneras.

1) marque una función con __declspec (dllexport).

O

2) utilizar un archivo .def que enumera todas aquellas funciones que se van a exportar.

Solución:

1) Por lo general, requiere una indicación de tiempo de compilación para ser fijado para activar un bloque de preprocesador #define para establecer alguna a la __declspec(). Alguien más lo mencionó en su publicación.

2) Requiere el establecimiento de la línea Propiedades-> Enlazador-> Entrada-> Archivo de definición del módulo.

Cuestiones relacionadas