Compartir a través de


Tutorial: Creación de proyectos multiplataforma de C++ en Visual Studio

El desarrollo de Visual Studio C y C++ ya no es solo para Windows. En este tutorial se muestra cómo usar Visual Studio para el desarrollo multiplataforma de C++ en Windows y Linux. Se basa en CMake, por lo que no es necesario crear ni generar proyectos de Visual Studio. Al abrir una carpeta que contiene un archivo CMakeLists.txt, Visual Studio configura IntelliSense y compila automáticamente las opciones de compilación. Puede empezar a editar, compilar y depurar rápidamente el código localmente en Windows. A continuación, cambie la configuración para que haga lo mismo en Linux, todo desde Visual Studio.

En este tutorial, aprenderá a:

  • clonar un proyecto de CMake de código abierto desde GitHub
  • abrir el proyecto en Visual Studio
  • Compilar y depurar un destino ejecutable en Windows
  • agregar una conexión a una máquina Linux
  • Compilar y depurar el mismo destino en Linux

Prerrequisitos

  • Configuración de Visual Studio para el desarrollo multiplataforma de C++

    • En primer lugar, instale Visual Studio y elija desarrollo de escritorio con C++ y desarrollo de Linux con cargas de trabajo de C++. Esta instalación mínima es de solo 3 GB. En función de la velocidad de descarga, la instalación no debe tardar más de 10 minutos.
  • Configuración de una máquina Linux para el desarrollo multiplataforma de C++

    • Visual Studio no requiere ninguna distribución específica de Linux. El sistema operativo se puede ejecutar en una máquina física, en una máquina virtual o en la nube. También puede usar el Subsistema de Windows para Linux (WSL). Sin embargo, para este tutorial, se requiere un entorno gráfico. WSL no se recomienda aquí, ya que está pensado principalmente para operaciones de línea de comandos.

    • Visual Studio requiere estas herramientas en la máquina Linux: compiladores de C++, gdb, ssh, rsync, makey zip. En sistemas basados en Debian, puede usar este comando para instalar estas dependencias:

      sudo apt install -y openssh-server build-essential gdb rsync make zip
      
    • Visual Studio requiere una versión reciente de CMake en la máquina Linux con el modo de servidor habilitado (al menos 3.8). Microsoft genera una compilación universal de CMake que puede instalar en cualquier distribución de Linux. Se recomienda usar esta compilación para asegurarse de que tiene las características más recientes. Puede obtener los archivos binarios de CMake de la bifurcación de Microsoft del repositorio de CMake en GitHub. Vaya a esa página y descargue la versión que coincida con la arquitectura del sistema en la máquina Linux y, a continuación, marquela como ejecutable:

      wget <path to binary>
      chmod +x cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh
      
    • Puede ver las opciones para ejecutar el script con --help. Se recomienda usar la opción -prefix para especificar la instalación en la ruta de acceso /usr, ya que /usr/bin es la ubicación predeterminada donde Visual Studio busca CMake. En el ejemplo siguiente se muestra el script linux-x86_64. Cámbielo según sea necesario si usa una plataforma de destino diferente.

      sudo ./cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh --skip-license --prefix=/usr
      
  • Git para Windows instalado en el equipo Windows.

  • Una cuenta de GitHub.

Clonación de un proyecto de CMake de código abierto desde GitHub

En este tutorial se usa el SDK Bullet Physics en GitHub. Proporciona simulaciones de física y detección de colisiones para muchas aplicaciones. El SDK incluye programas ejecutables de ejemplo que se compilan y ejecutan sin tener que escribir otro código. Este tutorial no modifica ninguno de los scripts de compilación o código fuente. Para empezar, clone el repositorio bullet3 desde GitHub en la máquina donde tiene instalado Visual Studio.

git clone https://github.com/bulletphysics/bullet3.git
  1. En el menú principal de Visual Studio, elija Archivo > abrir > CMake. Vaya al archivo CMakeLists.txt en la raíz del repositorio bullet3 que descargó.

    Captura de pantalla del menú de Visual Studio que muestra File > Open > C Make. Todavía no se ha abierto una carpeta. Este es solo el menú abierto hasta este punto.

    Al abrir la carpeta, la estructura de carpetas será visible en el Explorador de soluciones.

    Captura de pantalla de la ventana Explorador de soluciones en el modo Vista de carpetas. Muestra el contenido del proyecto (archivos y carpetas) y CMakeLists.txt está resaltado.

    Esta vista muestra exactamente lo que está en el disco, no una vista lógica o filtrada. De forma predeterminada, no muestra archivos ocultos.

  2. Elija el botón Mostrar todos los archivos para ver todos los archivos de la carpeta.

    Captura de pantalla de la ventana Explorador de soluciones con el botón Mostrar todos los archivos resaltado. Este botón se encuentra en la parte superior de la ventana del Explorador de soluciones y a la derecha.

Cambio a la vista de destinos

Al abrir una carpeta que usa CMake, Visual Studio genera automáticamente la caché de CMake. Esta operación puede tardar unos instantes, en función del tamaño del proyecto.

  1. En la ventana salida, seleccione Mostrar salida de y, a continuación, elija CMake para supervisar el estado del proceso de generación de caché. Una vez completada la operación, indica "Se ha realizado la extracción de información de destino".

    Captura de pantalla de la ventana de salida. El menú desplegable Mostrar salida de: se establece en CMake.

    Una vez completada esta operación, IntelliSense se configura. Ya puede compilar el proyecto y depurar la aplicación. Visual Studio muestra ahora una vista lógica de la solución, en función de los destinos especificados en los archivos CMakeLists.

  2. Utilice el botón Soluciones y carpetas del Explorador de Soluciones para cambiar a la Vista de Objetivos de CMake.

    Captura de pantalla del botón Soluciones y carpetas en el Explorador de soluciones. Este está seleccionado y muestra una lista desplegable con una opción para c:\projects\bullet3 y otra opción para Vista de Destinos de CMake, que está seleccionada.

    Así es como se ve esa vista en el Bullet SDK.

    Captura de pantalla de la vista de objetivos de CMake del Explorador de Soluciones. Contiene una entrada llamada BULLET_PHYSICS Project, que incluye entradas como App_BasicExample (ejecutable), App_ExampleBrowser (ejecutable), entre otras.

    En la vista de destinos se proporciona una vista más intuitiva del contenido de esta base de código fuente. Puede ver que algunos destinos son bibliotecas y otros son ejecutables.

  3. Expanda un nodo en la vista Destinos de CMake para ver sus archivos de código fuente, dondequiera que esos archivos se encuentren en el disco.

Agregar una configuración explícita de Windows x64-Debug

Visual Studio crea una configuración de depuración x64 predeterminada para Windows. Las configuraciones son la forma en que Visual Studio entiende qué destino de plataforma va a usar para CMake. La configuración predeterminada no se representa en el disco. Al agregar explícitamente una configuración, Visual Studio crea un archivo denominado CMakeSettings.json. Se rellena con los ajustes de todas las configuraciones que especifique.

  1. Agregue una nueva configuración. Abra la lista desplegable Configuración de la barra de herramientas y seleccione Administrar configuraciones.

    Captura de pantalla de la lista desplegable Configuración de la barra de herramientas. Administrar configuraciones... está seleccionado.

    Se abre el Editor de configuración de CMake . Seleccione el signo más verde en el lado izquierdo del editor para agregar una nueva configuración. Aparece el cuadro de diálogo Agregar configuración a CMakeSettings :

    Captura de pantalla del cuadro de diálogo Agregar configuración a CMakeSettings. Tiene entradas como Linux-Debug, x86-Debug. x64-Debug está seleccionado.

    En este cuadro de diálogo se muestran todas las configuraciones incluidas con Visual Studio, además de las configuraciones personalizadas que cree. Si quiere continuar usando una configuración x64-Debug, esa debería ser la primera que agregue. Seleccione x64-Debug y, a continuación, elija el botón Seleccionar . Visual Studio crea el archivo CMakeSettings.json con una configuración para x64-Debug y lo guarda en el disco. Puede usar los nombres que quiera para las configuraciones cambiando el parámetro name directamente en CMakeSettings.json.

Establecimiento de un punto de interrupción, compilación y ejecución en Windows

En este paso, depuramos un programa de ejemplo que muestra la biblioteca Bullet Physics.

  1. En el Explorador de soluciones, seleccione AppBasicExampleGui y expándalo.

  2. Abra el archivo BasicExample.cpp.

  3. Establezca un punto de interrupción que se alcance al hacer clic en la aplicación en ejecución. El evento click se controla en un método dentro de una clase auxiliar. Para llegar rápidamente:

    1. Seleccione CommonRigidBodyBase, de donde se deriva el struct BasicExample. Está alrededor de la línea 30.

    2. Haga clic con el botón derecho y elija Ir a Definición. Ahora está en el encabezado CommonRigidBodyBase.h.

    3. En la vista de explorador encima del origen, debería ver que se encuentra en CommonRigidBodyBase. A la derecha, puede seleccionar miembros para examinarlos. Abra la lista desplegable y seleccione mouseButtonCallback para ir a la definición de esa función en el encabezado.

      Captura de pantalla del menú desplegable de la barra de herramientas de la lista de miembros en la ventana del editor. Enumera funciones como getRayTo(in x, int y). Se resalta el método de devolución de llamada del botón del mouse.

  4. Coloque un punto de interrupción en la primera línea dentro de esta función. Se alcanzará al hacer clic en un botón del mouse en la ventana de la aplicación cuando se ejecute en el depurador de Visual Studio.

  5. Para iniciar la aplicación, seleccione la lista desplegable Launch (Iniciar) en la barra de herramientas. Es el que tiene el icono de reproducción verde que dice "Seleccionar elemento de inicio". En la lista desplegable, seleccione AppBasicExampleGui.exe. El nombre del archivo ejecutable ahora se muestra en el botón iniciar:

    Captura de pantalla de la lista desplegable Inicio de la barra de herramientas de Visual Studio. AppBasicExampleGui.exe está seleccionado, pero otras opciones son visibles, como App_ExampleBrowser.exe, App_HelloWorld.exey otras.

  6. Elija el botón iniciar para compilar la aplicación y las dependencias necesarias y, a continuación, iníciela con el depurador de Visual Studio asociado. Después de unos instantes, aparece la aplicación en ejecución:

    Captura de pantalla de la aplicación en ejecución. Es una colección de bloques coloreados en un plano amarillo.

  7. Mueva el mouse a la ventana de la aplicación y haga clic en un botón para desencadenar el punto de interrupción. El punto de interrupción devuelve Visual Studio al primer plano y el editor muestra la línea donde se pausa la ejecución. Puede inspeccionar las variables de aplicación, los objetos, los subprocesos y la memoria, o recorrer el código de forma interactiva. Elija Continuar para permitir que la aplicación se reanude y, a continuación, salir con normalidad. O bien, detenga la ejecución en Visual Studio mediante el botón Detener.

Adición de una configuración de Linux y conexión a la máquina remota

  1. Agregue una configuración de Linux. Haga clic con el botón derecho en el archivo CMakeSettings.json en la vista Explorador de soluciones y seleccione Agregar configuración. Verá el mismo cuadro de diálogo Agregar configuración a CMakeSettings que antes. Seleccione Linux-Debug esta vez y guarde el archivo CMakeSettings.json (ctrl + s).

  2. Visual Studio 2019, versión 16.6 o posterior Desplácese hacia abajo hasta la parte inferior del Editor de configuración de CMake y seleccione Mostrar configuración avanzada. Seleccione Archivos Make de Unix como generador de CMake y, a continuación, guarde el archivo CMakeSettings.json (ctrl + s).

  3. Seleccione Linux-Debug en la lista desplegable de configuración.

    Captura de pantalla de la lista desplegable de configuración de inicio. Las opciones visibles son: x64-Debug, Linux-Debug y Manage Configurations.

    Si es la primera vez que se conecta a un sistema Linux, aparece el cuadro de diálogo Conectar al sistema remoto .

    Captura de pantalla del cuadro de diálogo Conectar con el sistema remoto de Visual Studio.

    El cuadro de diálogo tiene campos para el nombre de host, el puerto, el nombre de usuario, el tipo de autenticación y la contraseña. Todos los campos están en blanco, excepto que El puerto está establecido en 22 y el tipo de autenticación está establecido en Contraseña.

    Si ya ha agregado una conexión remota, puede abrir esta ventana; para ello, vaya a Herramientas > Opciones > administrador de conexiones multiplataforma>.

  4. Proporcione la información de conexión a la máquina Linux y elija Conectar. Visual Studio agrega esa máquina a CMakeSettings.json como conexión predeterminada para Linux-Debug. También extrae los encabezados de la máquina remota, por lo que obtiene IntelliSense específico de esa conexión remota. A continuación, Visual Studio envía los archivos a la máquina remota y genera la caché de CMake en el sistema remoto. Estos pasos pueden tardar algún tiempo, en función de la velocidad de la red y la potencia de la máquina remota. Sabe que está completo cuando aparece el mensaje "Extracción de información de destino finalizada" en la ventana de salida de CMake.

Establecimiento de un punto de interrupción, compilación y ejecución en Linux

Como se trata de una aplicación de escritorio, debe proporcionar información de configuración adicional a la configuración de depuración.

  1. En la vista Destinos de CMake, haga clic con el botón derecho en AppBasicExampleGui y elija Depurar e Iniciar configuración para abrir el archivo launch.vs.json que se encuentra en la subcarpeta oculta .vs . Este archivo es local para el entorno de desarrollo. Puede moverlo a la raíz del proyecto si quiere insertarlo en el repositorio y guardarlo con su equipo. En este archivo, se ha agregado una configuración para AppBasicExampleGui. Esta configuración predeterminada funciona en la mayoría de los casos, pero no aquí. Dado que es una aplicación de escritorio, debe proporcionar información adicional para iniciar el programa para que pueda verlo en la máquina Linux.

  2. Para buscar el valor de la variable DISPLAY de entorno en la máquina Linux, ejecute este comando:

    echo $DISPLAY
    

    En la configuración de AppBasicExampleGui, hay una matriz de parámetros, "pipeArgs". Contiene una línea: "${debuggerCommand}". Es el comando que inicia gdb en la máquina remota. Visual Studio debe exportar la presentación a este contexto antes de que se ejecute ese comando. Por ejemplo, si el valor de la pantalla es :1, modifique esa línea de la siguiente manera:

    "export DISPLAY=:1;${debuggerCommand}",
    
  3. Inicie y depure la aplicación. Abra la lista desplegable Seleccionar elemento de inicio en la barra de herramientas y elija AppBasicExampleGui. A continuación, elija el icono de reproducción verde en la barra de herramientas o presione F5. La aplicación y sus dependencias se basan en la máquina Linux remota y, a continuación, se inician con el depurador de Visual Studio conectado. En la máquina Linux remota, debería ver que aparece una ventana de aplicación.

  4. Mueva el mouse a la ventana de la aplicación y haga clic en un botón. Se alcanza el punto de interrupción. La ejecución del programa se detiene, Visual Studio vuelve al primer plano y ve el punto de interrupción. También debería ver que aparece una ventana de consola de Linux en Visual Studio. La ventana proporciona la salida de la máquina Linux remota y también puede aceptar entradas para stdin. Al igual que cualquier ventana de Visual Studio, puede acoplarla donde prefiera verla. Su posición se conservará en futuras sesiones.

    Captura de pantalla de la ventana de consola de Linux de Visual Studio.

    La salida de la ventana indica que las funciones C11 cargadas dinámicamente mediante dlopen/dlsym son correctas. Se ha creado un contexto GL 3.0, y el contexto de renderizado Direct GLX ha sido obtenido y activado. La ventana tiene información de versión para GL_VENDOR, GL_VERSION, GL_SHADING_LANGUAGE_VERSION, etc.

  5. Puede inspeccionar las variables de aplicación, los objetos, los subprocesos, la memoria y recorrer el código de forma interactiva mediante Visual Studio. Pero esta vez, lo hace todo en una máquina Linux remota en lugar de en el entorno local de Windows. Puede elegir Continuar para permitir que la aplicación se reanude y salga normalmente, o bien puede elegir el botón detener, como con la ejecución local.

  6. Examine la ventana Pila de llamadas y vea las llamadas a x11OpenGLWindow desde que Visual Studio inició la aplicación en Linux.

    La ventana Pila de llamadas de Visual Studio, que muestra la pila de llamadas de Linux.

    La pila de llamadas muestra el punto de ruptura en CommonRigidBodyBase::mouseMoveCallback y las llamadas que preceden a este, como OnMouseMove, X11OpenGLWindow::pumpMessage, etc.

Qué has aprendido

En este tutorial, ha clonado una base de código directamente desde GitHub. Compilaste, ejecutaste y depuraste en Windows sin modificaciones. A continuación, ha usado la misma base de código, con cambios de configuración menores, para compilar, ejecutar y depurar en una máquina Linux remota.

Pasos siguientes

Obtenga más información sobre cómo configurar y depurar proyectos de CMake en Visual Studio: