Uso de CMake para generar archivos de proyecto de Visual Studio C++


Estoy trabajando en un proyecto de código abierto C++, para código que compila en Linux y Windows. Yo uso CMake para construir el código en Linux. Para facilitar la configuración del desarrollo y por razones políticas, debo atenerme a Visual Studio project files / editor en Windows (no puedo cambiar a Code::Blocks, por ejemplo). Veo instrucciones para generar archivos de Visual Studio usando CMake, como aquí.

¿Ha usado CMake para generar archivos de Visual Studio antes? ¿Cómo ha sido tu experiencia? Supongamos que quiero añadir un nuevo archivo a mi proyecto. ¿Cuál es el flujo de trabajo para esto?

Author: Peter Mortensen, 2008-12-27

8 answers

CMake es bastante bueno para esto. La parte clave fue que todos en el lado de Windows tienen que recordar ejecutar CMake antes de cargar la solución, y todos en nuestro lado de Mac tendrían que recordar ejecutarlo antes de make.

La parte más difícil fue como desarrollador de Windows asegurarse de que sus cambios estructurales en la cmakelist.archivo txt y no en la solución o archivos de proyecto como los cambios probablemente perderse e incluso si no se pierde no se transfieren a la Mac lado que también los necesitaba, y los chicos de Mac tendrían que recordar no modificar el archivo make por las mismas razones.

Solo requiere un poco de pensamiento y paciencia, pero al principio habrá errores. Pero si está utilizando la integración continua en ambos lados, entonces estos se sacudirán temprano, y la gente eventualmente adquirirá el hábito.

 53
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-22 00:02:10

No estoy seguro de si está directamente relacionado con la pregunta, pero estaba buscando una respuesta sobre cómo generar *.sln de proyectos cmake He descubierto que uno puede usar algo como esto:

cmake -G "Visual Studio 10"

El ejemplo genera archivos VS 2010 necesarios a partir de una lista de CMAKEL de entrada.txt file

 39
Author: Ghita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-13 11:39:43

Movimos la cadena de construcción de nuestro departamento a CMake, y tuvimos algunos problemas internos ya que otros departamentos usaban nuestros archivos de proyecto y estaban acostumbrados a importarlos a sus soluciones. También tuvimos algunas quejas de que CMake no estaba completamente integrado en el gestor de proyectos/soluciones de Visual Studio, por lo que los archivos tuvieron que agregarse manualmente a las listas de CMakeLists.txt; esta fue una gran ruptura en el flujo de trabajo al que la gente estaba acostumbrada.

Pero en general, fue bastante suave transición. Estamos muy contentos ya que ya no tenemos que lidiar con archivos de proyecto.

El flujo de trabajo concreto para agregar un nuevo archivo a un proyecto es realmente simple:

  1. Cree el archivo, asegúrese de que esté en el lugar correcto.
  2. Agregue el archivo a las listas de CMakeLists.txt.
  3. Construir.

CMake 2.6 se vuelve a ejecutar automáticamente si hay alguna lista de CMAKEL.los archivos txt han cambiado (y (semi)recargan automáticamente la solución / proyectos).

Recuerde que si usted está haciendo compilaciones fuera del código fuente, debe tener cuidado de no crear el archivo fuente en el directorio de compilación (ya que Visual Studio solo conoce el directorio de compilación).

 26
Author: JesperE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-28 19:03:22

Como dice Alex, funciona muy bien. La única parte difícil es recordar hacer cualquier cambio en los archivos cmake, en lugar de hacerlo desde Visual Studio. Así que en todas las plataformas, el flujo de trabajo es similar a si hubiera utilizado makefiles antiguos.

Pero es bastante fácil trabajar con él, y no he tenido problemas con cmake generando archivos no válidos ni nada por el estilo, así que no me preocuparía demasiado.

 10
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-27 21:26:02

CMake puede generar un estudio Visual realmente agradable.projs/.slns, pero siempre existe el problema con la necesidad de modificar los archivos .cmake en lugar de .proj/.sln. Como es ahora, estamos tratando con él de la siguiente manera:

  1. Todos los archivos fuente van a /src y los archivos visibles en Visual Studio son solo "enlaces" a ellos definidos en .filter.
  2. El programador agrega/elimina archivos recordando trabajar en el directorio definido /src, no en el directorio predeterminado del proyecto.
  3. Cuando haya terminado, correrá un script que "actualiza" los respectivos archivos .cmake.
  4. Comprueba si el código puede ser construido en el entorno recreado.
  5. Él confirma el código.

Al principio teníamos un poco de miedo de cómo resultaría, pero el flujo de trabajo funciona muy bien y con un buen diff visible antes de cada confirmación, todos pueden ver fácilmente si sus cambios se asignaron correctamente en los archivos .cmake.

Una cosa más importante que debe saber es la falta de apoyo (afaik) para "Configuraciones de solución" en CMake. Tal como está, debe generar dos directorios con proyectos/soluciones, uno para cada tipo de compilación (depuración, versión, etc.).). No hay soporte directo para funciones más sofisticadas, en otras palabras: cambiar entre configuraciones no le dará lo que podría esperar.

 6
Author: Red XIII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-22 21:22:04

CMake produce Proyectos y Soluciones de Visual Studio sin problemas. Incluso puede producir proyectos / soluciones para diferentes versiones de Visual Studio sin hacer ningún cambio en los archivos CMake.

Agregar y eliminar archivos fuente es solo cuestión de modificar el CMakeLists.txt que tiene la lista de archivos fuente y regenerar los proyectos/soluciones. Incluso hay una función de globbing para encontrar todas las fuentes en un directorio (aunque debe usarse con precaución).

El siguiente enlace explica muy bien el comportamiento específico de CMake y Visual Studio.

CMake y Visual Studio

 5
Author: ap-osd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-07 11:56:58

He comenzado mi propio proyecto, llamado syncProj. Documentación / enlaces de descarga desde aquí:

Https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit # https://sourceforge.net/projects/syncproj /

Si planea usar Visual studio para el desarrollo y actualmente solo se admite C++.

La principal ventaja en comparación con otros sistemas make es que en realidad puede depurar su script, ya que está basado en C#.

Si no está familiarizado con syncProj, solo puede convertir su solución / proyecto a .cs script, y continuar el desarrollo a partir de ese momento.

En cmake tendrás que escribir todo desde cero.

 0
Author: TarmoPikaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-10 22:11:45

Muchas respuestas excelentes aquí, pero podrían ser reemplazadas por este soporte CMake en Visual Studio (Oct 5 2016)

 0
Author: S Meaden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-24 21:31:55