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

91

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

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

amit
fuente
1
Para aquellos en GNU + Linux que intentan generar archivos de proyecto para Visual Studio, que es específico de Windows, tenga en cuenta esta respuesta . TL; DR: los generadores son específicos de la plataforma y debe estar en Windows para hacerlo.
code_dredd

Respuestas:

57

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

La parte más difícil fue como desarrollador de Windows asegurarse de que sus cambios estructurales estuvieran en el archivo cmakelist.txt y no en los archivos de la solución o del proyecto, ya que esos cambios probablemente se perderían e incluso si no se perderían no se transferirían al lado de Mac 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 reflexión y paciencia, pero al principio habrá errores. Pero si está utilizando la integración continua en ambos lados, estos se eliminarán temprano y la gente eventualmente adquirirá el hábito.

Alex
fuente
11
Si esto fue cierto una vez, ya no lo es. Cualquier cambio en CMakeLists.txt provocará una regeneración del sistema de compilación (archivos de proyecto para Visual Studio, Makefiles, etc.). El flujo de trabajo dentro de Visual Studio es un poco molesto, ya que Visual Studio no regenera los archivos del proyecto cuando detecta que las cosas han cambiado, sino que espera a que realice una compilación que hace que aparezca un cuadro de diálogo, ya que la compilación debe cancelarse para volver -cargar el archivo del proyecto.
Vitali
1
La advertencia a esto es que no es necesario ejecutar el compilador de Visual Studio a través del IDE. Puede ejecutarlo en la línea de comando:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy
2
@PfunnyGuy Véase también cmake --build ..
detly
@detly ¡Gracias! De hecho, encontré eso y utilicé cmake --build . --config Debug -- /nologo /verbosity:minimal /m. Insertaré después . target run_testspara ejecutar mi prueba unitaria de googletest, y "Depurar" se puede reemplazar por "Liberar". (Agregar la opción de configuración para Debug es opcional, ya que es la predeterminada, pero la
incluí
47

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

cmake -G "Visual Studio 10"

El ejemplo genera los archivos VS 2010 necesarios a partir de un archivo CMakeLists.txt de entrada

Ghita
fuente
1
En stackoverflow.com/questions/11269833/… @Ivan señala que esto se puede poner en un archivo PreLoad.cmake en la misma carpeta que su CMakeLists.txt de nivel superior y luego puede hacerlo cmake.
PfunnyGuy
25

Trasladamos la cadena de construcción de nuestro departamento a CMake, y tuvimos algunos obstáculos internos ya que otros departamentos usaban nuestros archivos de proyecto y estaban acostumbrados a importarlos a sus soluciones. También tuvimos algunas quejas acerca de que CMake no estaba completamente integrado en el administrador de proyectos / soluciones de Visual Studio, por lo que los archivos debían agregarse manualmente a CMakeLists.txt; esta fue una ruptura importante en el flujo de trabajo al que la gente estaba acostumbrada.

Pero, en general, fue una transición bastante fluida. Estamos muy contentos porque ya no tenemos que lidiar con archivos de proyectos.

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 CMakeLists.txt.
  3. Construir.

CMake 2.6 se vuelve a ejecutar automáticamente si algún archivo CMakeLists.txt ha cambiado (y (semi-) automáticamente recarga la solución / proyectos).

Recuerde que si está haciendo compilaciones fuera de la 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).

JesperE
fuente
9

Como dice Alex, funciona muy bien. La única parte complicada es recordar realizar cambios en los archivos cmake, en lugar de hacerlo desde Visual Studio. Entonces, en todas las plataformas, el flujo de trabajo es similar a si hubiera usado archivos MAKE viejos y simples.

Pero es bastante fácil trabajar con él, y no he tenido problemas con cmake para generar archivos no válidos ni nada de eso, por lo que no me preocuparía demasiado.

jalf
fuente
7

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

Agregar y eliminar archivos de origen es solo una cuestión de modificar el CMakeLists.txtque tiene la lista de archivos de origen y regenerar los proyectos / soluciones. Incluso hay una función 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

ap-osd
fuente
Ese enlace y su proyecto de muestra son muy, muy útiles, ¡gracias por eso! Recomendaría incorporar parte del código fuente del repositorio de github en su respuesta, por ejemplo, mencionar que un proyecto de CMake es el equivalente a una solución y que algo como add_executable se usa para agregar el equivalente de un proyecto de estudio visual.
jrh
5

CMake puede generar Visual Studio .projs/ realmente agradable .slns, pero siempre existe el problema con la necesidad de modificar los .cmakearchivos en lugar de .proj/ .sln. Tal como está ahora, lo tratamos de la siguiente manera:

  1. Todos los archivos de origen /srcy los archivos visibles en Visual Studio son solo "enlaces" a ellos definidos en .filter.
  2. El programador agrega / elimina archivos recordando trabajar en el definido /src directorio , no en el del proyecto predeterminado.
  3. Cuando termina, ejecuta un script que "actualiza" los .cmakearchivos respectivos .
  4. Comprueba si el código se puede construir en el entorno recreado.
  5. Comete 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 una buena diferencia visible antes de cada confirmación, todos pueden ver fácilmente si sus cambios se asignaron correctamente en los .cmakearchivos.

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

Rojo XIII
fuente
4
A partir de CMake 2.8.10, las soluciones generadas tienen las 4 configuraciones de compilación habituales y hay soporte para definir otras personalizadas.
John
0

Comencé mi propio proyecto, llamado syncProj. Enlaces de documentación / descarga desde aquí:

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

Si planea utilizar Visual Studio para el desarrollo y actualmente solo se admite C ++.

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

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

En cmake deberás escribir todo desde cero.

TarmoPikaro
fuente