¿Cómo construyo una biblioteca de importación (.lib) Y una DLL en Visual C ++?

Quiero tener un solo proyecto de Visual Studio que cree un archivo DLL y un archivo de biblioteca de importación (.lib). (Una biblioteca de importación es una biblioteca enlazada estáticamente que se encarga de cargar ese archivo DLL en otros proyectos que lo usan).

Así que fui a Visual Studio C ++ 2008 Express Edition, creé un nuevo proyecto de tipo Class Library y configuré el “Tipo de configuración” para que fuera “Dyanamic Library (.dll)”.

Pero cuando construyo la solución, el único archivo de salida relevante que veo es un archivo DLL; No veo que se genere ningún archivo LIB. Busqué en el directorio del proyecto y en todos los subdirectorios (Release and Debug).

Creo que es posible construir un archivo LIB y un archivo DLL al mismo tiempo porque en el MSDN dice “El enlazador crea la biblioteca de importación cuando se genera el archivo DLL”. Además, otro usuario de este sitio web está creando archivos LIB y DLL al mismo tiempo utilizando Visual C ++ .

Entonces, ¿cómo puedo hacerlo?

Al seleccionar ‘Biblioteca de clases’, accidentalmente le indicaba que creara una biblioteca .Net utilizando la extensión CLI (administrada) de C ++.

En su lugar, cree un proyecto de Win32, y en la Configuración de la aplicación en la página siguiente, elija ‘DLL’.

También puede crear una DLL de MFC o ATL de esas opciones de biblioteca si desea ir por esa ruta, pero parece que no es así.

¿Su proyecto DLL tiene exportaciones reales? Si no hay exportaciones, el vinculador no generará un archivo .lib de biblioteca de importación.

En la versión no Express de VS, el nombre de la biblioteca importada se especifica en la configuración del proyecto aquí:

Configuration Properties/Linker/Advanced/Import Library 

Supongo que es lo mismo en Express (si incluso ofrece la posibilidad de configurar el nombre).

OK, entonces encontré la respuesta de http://binglongx.wordpress.com/2009/01/26/visual-c-does-not-generate-lib-file-for-a-dll-project/ dice que este problema fue causado al no exportar ningún símbolo y además instruye sobre cómo exportar símbolos para crear el archivo lib. Para hacerlo, agregue el siguiente código a su archivo .h para su DLL.

 #ifdef BARNABY_EXPORTS #define BARNABY_API __declspec(dllexport) #else #define BARNABY_API __declspec(dllimport) #endif 

Donde BARNABY_EXPORTS y BARNABY_API son definiciones únicas para su proyecto. Entonces, cada función que exportas simplemente precede por:

 BARNABY_API int add(){ } 

Este problema podría haberse evitado al hacer clic en el cuadro Exportar símbolos en el nuevo asistente de DLL del proyecto o al votar sí por las lobotomías para los progtwigdores de computadoras.

también debe especificar el nombre de def en la configuración del proyecto aquí:

Configuración> Propiedades / Entrada / Avanzado / Módulo> Archivo de definición