2010-12-08 6 views
6

Tengo una gran solución de estudio visual con ~ 50 proyectos. Hay configuraciones para StaticDebug, StaticRelease, Debug y Release. Algunas bibliotecas son necesarias tanto en dll como en forma de lib estática. Para obtenerlos, reconstruimos la solución con una configuración diferente. La ventana Configuration Manager se usa para configurar qué proyectos necesitan compilar en qué sabores, lib estático, dll dinámico o ambos.¿Cómo puedo gestionar la construcción de proyectos de biblioteca que produzcan tanto una lib estática como una dll?

Esto puede ser bastante difícil de manejar y es un poco molesto tener que construir la solución varias veces y seleccionar las configuraciones en el orden correcto. Las versiones estáticas necesitan compilación antes de las versiones no estáticas.

Me pregunto, en lugar de este esquema actual, podría ser más sencillo de administrar si, para los proyectos que necesitaba para producir una lib estática y dinc dll, creé dos proyectos. Por ejemplo:

  • CoreLib
  • coredll

que podía hacer cualquiera de estos dos proyectos de referencia a todos los mismos archivos y construir ellos dos veces, o yo estoy preguntando, ¿sería posible construir CoreLib y luego obtener CoreDll para vincularlo para generar el dll?

Supongo que mi pregunta es, ¿tiene algún consejo sobre cómo estructurar sus proyectos en este tipo de situación?

Gracias.

+0

Uso el método de dos proyectos, aunque normalmente estoy haciendo versiones de 32 y 64 bits de algo, es esencialmente lo mismo. ¿Puedes hacerlo sin dos compilaciones? En VS, no lo creo. De makefiles, sí. – Tergiver

+0

... sin embargo, es probable que tenga algunas directivas de compilación en el origen para las dos compilaciones diferentes. Por lo menos, la versión estática no necesita DllMain. – Tergiver

+0

He proporcionado una nueva respuesta y he eliminado la anterior –

Respuesta

3

Haga una copia de su archivo de proyecto original en el explorador como CoreLib.vcxproj (en caso de otra VS comprobar la extensión apropiada)

Añadir CoreLib.vcxproj como un proyecto existente para su solución y guardar su solución.

Ir a la propiedades-> Configuración Properties-> General de CoreLib.

Seleccione todas las configuraciones (esquina superior izquierda).

Cambiar propiedad Tipo de configuración a biblioteca estática.

Cambiar propiedad Extensión de destino a .lib.

Agregar a la propiedad Directorio intermedio por ejemplo \ Lib \.

Ir a la propiedades-> Configuración Properties-> C/C++ -> Preporcessor

Seleccionar depuración de configuración (esquina superior izquierda).

Ahora Editar la propiedad definiciones del preprocesador y cambiar la línea _USRDLL en _USRLIB

Seleccionar lanzamiento de configuración (esquina superior izquierda).

Ahora edite la propiedad definiciones del preprocesador y cambiar la línea _USRDLL en _USRLIB

En su cabecera de archivo que debe tener algo como lo siguiente:

#ifdef MyDll_EXPORTS 
#define MyDll_API  __declspec(dllexport) 
#else 
#define MyDll_API  __declspec(dllimport) 
#endif 

cambio en algo como lo siguiente:

#ifdef MyDll_EXPORTS  
#ifdef _USRLIB  
#define MyDll_API  
#else  
#define MyDll_API  __declspec(dllexport)  
#endif  
#else 
// Here must deploy your own logic whether static or dynamic linking is used. 
// read my comment below 
#define MyDll_API  __declspec(dllimport)  
#endif 

¡Ahora su compilación genera su dll original e importa lib, así como una nueva lib estática!

+0

@Scott Langham: Creo que es mejor proporcionar 3 archivos de cabecera. Uno para la versión dll y otro para la versión lib, ambos incluyen la API real. –

1

Tal vez podría comprobar qué tipo de sistema de construcción como CMake produce en este caso. Supongo que generará dos proyectos para cada caso. Pero al crear la solución de esta manera posiblemente podría ahorrarle mucho trabajo.

Cuestiones relacionadas