visual una studio solucion proyecto hacer extension extender empty create crear como c++ winapi visual-studio-2005 projects-and-solutions vsprops

c++ - una - visual studio create solution



Construyendo DLL y libs estáticas del mismo proyecto (7)

Creo que la manera típica de hacerlo es la opción 2 anterior. Es lo que uso y lo que he visto hacer en varias bibliotecas y compañías.

Si crees que no funciona para ti, utiliza otra cosa.

Buena suerte.

Tengo varias librerías nativas de C ++ (Win32, sin MFC) compiladas bajo Visual Studio 2005, y usadas en una cantidad de soluciones.

Me gustaría poder elegir compilarlos y vincularlos como bibliotecas estáticas o DLL, según las necesidades de la solución particular en la que los estoy usando.

¿Cuál es la mejor manera de hacer esto? He considerado estos enfoques:

1. Múltiples archivos de proyecto

  • Ejemplo: "foo_static.vcproj" vs "foo_dll.vcproj"
  • Pro: fácil de generar para nuevas bibliotecas, no demasiada manual vcproj munging.
  • Con: ajustes, listas de archivos, etc. en dos lugares se desincronizan demasiado fácilmente.

2. Archivo de proyecto único, configuraciones múltiples

  • Ejemplo: "Depurar | Win32" frente a "Depurar DLL | Win32", etc.
  • Pro: las listas de archivos son más fáciles de mantener sincronizadas; las opciones de compilación son algo más fáciles de mantener sincronizadas
  • Con: construyo tanto para Win32 como para dispositivos inteligentes, por lo que ya tengo varias configuraciones; No quiero empeorar mi explosión combinatoria ("Biblioteca estática para FooPhone | WinMobile 6", "Biblioteca dinámica para FooPhone | WinMobile 6", "Biblioteca estática para BarPda | WinMobile 6", etc.
  • Peor Con: VS 2005 tiene la mala costumbre de asumir que si tiene una configuración definida para la plataforma "Foo", entonces realmente la necesita para todas las otras plataformas en su solución, y inserta aleatoriamente todas las permutaciones de configuración / configuraciones de plataforma en todo el archivos vcproj afectados, ya sean válidos o no. (Error archivado con MS; cerrado como WONTFIX)

3. Archivo de proyecto único, seleccionando archivos estáticos o dinámicos a través de vsprops

  • Ejemplo: almacene los fragmentos vcproj apropiados en archivos de hojas de propiedades, luego aplique la hoja de propiedades "Biblioteca estática de FooApp" a las combinaciones de configuración / plataforma cuando desee bibliotecas estáticas y aplique la hoja de propiedades "DLL de FooApp" cuando desee archivos DLL.
  • Pros: ¡ Esto es lo que realmente quiero hacer!
  • Contras: no parece posible. Parece que el atributo .vcproj que cambia entre las bibliotecas estáticas y dinámicas (el atributo ConfigurationType del elemento Configuration) no es anulable por el archivo .vsprops. El esquema publicado de Microsoft para estos archivos enumera solo los elementos <Tool> y <UserMacro>.

EDITAR : en caso de que alguien lo sugiera, también he intentado una versión más "inteligente" de la # 3, en la que defino un .vsprops que contiene un UserMacro llamado "ModuleConfigurationType" con un valor de "2" (DLL) o " 4 "(biblioteca estática) y cambió la configuración en .vcproj para tener ConfigurationType="$(ModuleConfigurationType)" . Visual Studio silencia y sin previo aviso elimina el atributo y lo reemplaza con ConfigurationType="1" . ¡Tan útil!

¿Me estoy perdiendo una mejor solución?


¿Por qué no ir a la versión 1 y generar el segundo conjunto de archivos de proyecto desde el primero usando un script o algo así? De esta forma, sabrá que las diferencias son SOLO las piezas necesarias para construir una dll o lib estática.


Múltiples proyectos son la mejor manera de hacerlo: esta es la configuración que más he visto en un montón de proyectos con los que me he cruzado.

Dicho esto, también podría ser posible implementar la tercera opción modificando sus archivos vcproj sobre la marcha desde herramientas externas (como un vbscript personalizado), que podría invocar desde un archivo make. Puede usar variables de shell para controlar el comportamiento de la herramienta.

Tenga en cuenta que todavía debe usar el uso de Visual Studio para hacer la compilación, el archivo MAKE solo debe iniciar su herramienta externa si es necesario para hacer las modificaciones y luego seguir el comando de compilación real


Prefiero 2 formas de configuración.

Configure todos los ajustes comunes mediante el elemento ''Todas las configuraciones'' en una ventana de propiedades del proyecto. Después de separar la configuración. Y está hecho. Vamos a codificar.

También hay una característica muy buena llamada ''Batch build'', que construye configuraciones específicas por turno.


Uso Visual Studio 6.0 (Still) debido a problemas que nos impiden migrar a VS2005 o posterior. La reconstrucción causa problemas graves (todo se rompe) ... muchos de nosotros estamos considerando cabildear una migración a GnuC ++ avanzando de una manera estructurada para finalmente sacarnos de los productos licenciados de Visual Studio y en Eclipse y Linux.

En Unix / Linux es fácil de construir para todas las configuraciones ... así que no puedo creer lo que es una pérdida de tiempo y de productividad para tratar de lograr la misma tarea en Visual Studio. Para VS6.0 hasta ahora he encontrado que solo tener dos proyectos separados parece ser viable. Todavía no he probado la técnica de configuración múltiple, pero veré si funciona en el VS6.0 anterior.


Puede que me haya pasado algo por alto, pero ¿por qué no puedes definir el proyecto DLL sin archivos y simplemente vincular la lib creada por el otro proyecto? Y, con respecto a la configuración, puede factorizarlos en archivos vsprop ...


Existe una manera fácil de crear versiones estáticas y dll lib en un proyecto.

Crea tu proyecto dll. Entonces haz lo siguiente para ello:

Simplemente cree un archivo nmake makefile o .bat que ejecute la herramienta lib. Básicamente, esto es solo esto:

lib /NOLOGO /OUT:<your_lib_pathname> @<< <list_all_of_your_obj_paths_here> <<

Luego, en su proyecto, agregue un evento de publicación posterior donde el comando solo ejecute el archivo .bat (o nmake o perl). Entonces, siempre obtendrás una dll y una lib estática. Me abstendré de denigrar a Visual Studio por no permitir que la herramienta exista en un proyecto justo antes de Linker (en el flujo de herramientas).