2008-11-21 31 views
7

tengo unas pocas cosas que no puedo encontrar una buena manera de realizar en Visual Studio:complejo se basa en Visual Studio

  1. etapa de pre-construcción invoca un generador de código que genera algunos archivos de origen que se compilan tarde . Esto se puede resolver en una medida limitada al agregar archivos en blanco al proyecto (que luego se reemplazan con archivos generados de verdad), pero no funciona si no conozco los nombres y/o la cantidad de archivos fuente generados automáticamente. Puedo resolverlo fácilmente en GNU make usando $(wildcard generated/*.c). ¿Cómo puedo hacer algo similar con Visual Studio?

  2. ¿Puedo evitar que se ejecute un evento previo a la compilación/post-compilación si no es necesario modificar los archivos (comportamiento "make")? La solución actual es escribir un script de contenedor que verifique las marcas de tiempo para mí, que funciona, pero es un poco torpe.

  3. ¿Cuál es una buena manera de localizar librerías externas y encabezados instalados fuera de VS? En el caso * nix, normalmente se instalarían en las rutas del sistema o se ubicarían en autoconf. Supongo que puedo especificar rutas con macros definidas por el usuario en la configuración del proyecto, pero ¿dónde es un buen lugar para ubicar estas macros y poderlas encontrar y ajustar fácilmente?

Para ser claro, soy consciente de que la mejora de Windows construyen existen sistemas (CMake, SCons), pero por lo general generar archivos de proyecto VS sí mismos, y que necesito para integrar este proyecto en los actuales VS sistema de construcción, por lo es deseable que tenga solo archivos de proyecto VS, no generados.

Respuesta

5
  1. Si necesita hacer que el comportamiento y están acostumbrados a ello, puede crear visual studio makefile projects e incluirlos en su proyecto.

  2. Si quieres menos torpe, puedes escribir visual studio macros y crear eventos personalizados y vincularlos a callbacks/hooks específicos de construcción.

  3. Puede probar algo como workspacewhiz que le permitirá configurar las variables de entorno para su proyecto, en un formato de archivo que se pueda registrar. A continuación, los usuarios pueden modificarlas localmente.

+1

En cuanto al punto 3. los archivos '.vsprops' introducidos comenzando con VS2005 son la mejor opción. – 0xC0000022L

1

(1). No sé una respuesta simple a esto, pero hay soluciones:

1a. Si el contenido de los archivos generados no entra en conflicto (es decir, no hay identificadores estáticos comunes, etc.), puede agregar al proyecto un solo archivo, como AllGeneratedFiles.c, y modificar su generador para agregar un #include "generated/file. c "a este archivo cuando produce generado/archivo.c.

1b. O bien, puede crear un proyecto separado basado en el archivo MAKE para los archivos generados y compilarlos usando nmake.

(2). Use una regla de compilación personalizada en lugar de un evento de creación posterior. Puede agregar una regla de compilación personalizada haciendo clic derecho en el nombre del proyecto en el Explorador de soluciones y seleccionando Reglas personalizadas de compilación.

(3). No hay una forma estándar de hacer esto; tiene que definirse por proyecto. Un enfoque es usar variables de entorno para localizar dependencias externas.Luego puede usar esas variables de entorno en las propiedades del proyecto. Agregue un archivo readme.txt que describa las herramientas y bibliotecas necesarias y las variables de entorno correspondientes que el usuario debe establecer, y debería ser lo suficientemente fácil para que cualquiera pueda configurarlo.

+0

La respuesta 3. es incorrecta. Desde VS2005 uno puede usar archivos '.vsprops' para hacer esto exactamente en el alcance de su proyecto sin ayuda externa. Los he usado mucho desde entonces y he usado proyectos sin cambios con solo unos pocos parámetros relevantes ajustados en el archivo "hoja de propiedades" ('.vsprops'). Me doy cuenta de que esta respuesta es antigua, pero en ese momento se lanzaron VS2005 y 2008 y, por lo tanto, * había * una forma estándar de hacerlo. – 0xC0000022L

+0

@ 0xC0000022L No estoy de acuerdo con que esté mal. Claro, puedes usar hojas de apoyo. Sin embargo, no es un estándar de todo el sistema. Tendrá que desarrollar su propia convención de describir todas las bibliotecas a través de una jerarquía de hojas de apoyo, y hacer cumplir sistemáticamente. Conceptualmente, no es diferente del enfoque de variables de entorno sugerido en (3), y tiene la desventaja de bloquearlo en un sistema de compilación específico. – atzz

2

Específicamente para el n. ° 3, utilizo páginas de propiedades para designar configuraciones de ubicación de biblioteca de terceros (incluyen rutas, rutas de enlace, etc.). Puede usar Macros de usuario de una hoja de propiedades primaria o superior para designar el punto de partida de las bibliotecas (si se encuentran en una ubicación raíz común) y luego definir hojas individuales para cada biblioteca utilizando la macro de ruta base. No es automático, pero es fácil de mantener, y cada desarrollador puede tener un directorio raíz diferente si es necesario (está en nuestro entorno).

Una desventaja de este enfoque es que las rutas de inclusión construidas de esta manera no están incluidas en las rutas de búsqueda de Visual Studio (a menos que duplique las definiciones en los ajustes de proyectos y directorios para VS). Hablé con algunas personas de MS en PDC08 sobre cómo arreglar esto para VS2010, y cómo mejorar la interfaz en general, pero no hay promesas sólidas de ellos.

4

He pasado por este problema exacto y lo hice funcionar usando reglas de compilación personalizadas.

Pero siempre fue un dolor y funcionó mal. Abandoné Visual Studio y fui con un sistema Makefile usando cygwin. Mucho mejor ahora.

cl.exe es el nombre del compilador de VS.

Actualización: Recientemente cambié al uso de cmake, que viene con sus propios problemas, y cmake puede generar una solución de estudio visual. Esto parece funcionar bien.

1

Dependiendo exactamente de lo que intenta hacer, a veces puede tener algo de suerte con el uso de un paso de compilación personalizado y la configuración de sus dependencias correctamente. Puede ser útil colocar todo el código generado en su propio proyecto y luego hacer que su proyecto principal dependa de él.