vcpkg en proyectos de MSBuild

Métodos de integración

Integración a nivel de usuario

Para usar vcpkg en los proyectos de MSBuild, ejecute el siguiente comando:

vcpkg integrate install

Solo tiene que ejecutar el comando vcpkg integrate install la primera vez que quiera habilitar la integración de MSBuild. Esto permite la integración de MSBuild para todos los proyectos existentes y futuros.

Si tiene varias instancias de vcpkg, puede usar el vcpkg integrate install comando para actualizar la instancia de vcpkg que se usa en MSBuild. Usa vcpkg integrate remove para eliminar la integración de MSBuild para todos los usuarios.

Este método de integración agrega automáticamente paquetes instalados por vcpkg a las siguientes propiedades del proyecto: Incluir directorios, Directorios de vínculo y Bibliotecas de vínculos. Además, esto crea una acción posterior a la compilación que garantiza que los archivos DLL necesarios se copien en la carpeta de salida de compilación. Esto funciona para todas las soluciones y proyectos que usan Visual Studio 2017 o versiones posteriores.

Esto es todo lo que necesita hacer para la gran mayoría de las bibliotecas. Sin embargo, algunas bibliotecas realizan comportamientos conflictivos, como redefinir main(). Puesto que necesita elegir por proyecto cuál de estas opciones en conflicto desea, debe agregar manualmente esas bibliotecas a las entradas del enlazador.

Estos son algunos ejemplos en los que es necesario vincular manualmente (no una lista exhaustiva):

  • Gtest proporciona gtest, gmock, gtest_mainy gmock_main
  • SDL2 proporciona SDL2main
  • SFML proporciona sfml-main
  • Boost.Test proporciona boost_test_exec_monitor

Para obtener una lista completa de todos los paquetes instalados, ejecute vcpkg owns manual-link.

Importar .props y .targets

vcpkg también se puede integrar en proyectos de MSBuild mediante la importación explícita de los archivos scripts/buildsystems/vcpkg.props y scripts/buildsystems/vcpkg.targets en cada .vcxproj. Al usar rutas relativas, esto permite que vcpkg pueda ser utilizado por un submódulo y que los usuarios lo obtengan automáticamente al ejecutar git clone.

La manera más fácil de agregarlas a todos los proyectos de la solución es crear Directory.Build.props y Directory.Build.targets archivos en la raíz del repositorio.

Los siguientes ejemplos parten de la base de que están ubicados en la raíz de su repositorio, con un submódulo microsoft/vcpkg en vcpkg.

Por ejemplo, Directory.Build.props

<Project>
 <Import Project="$(MSBuildThisFileDirectory)vcpkg\scripts\buildsystems\msbuild\vcpkg.props" />
</Project>

Por ejemplo, Directory.Build.targets

<Project>
 <Import Project="$(MSBuildThisFileDirectory)vcpkg\scripts\buildsystems\msbuild\vcpkg.targets" />
</Project>

Consulte la sección Personaliza tu compilación de la documentación oficial de MSBuild para obtener más información sobre Directory.Build.targets y Directory.Build.props.

Pasar propiedades de MSBuild a triplets y portfiles

Puede pasar el valor de las propiedades de MSBuild a las compilaciones de vcpkg como variables de entorno utilizando la tarea SetEnv. Debe establecer estas variables de entorno antes de la VcpkgTripletSelection tarea.

En el ejemplo siguiente se muestra un proyecto de MSBuild que pasa el valor de la MyProp propiedad a vcpkg como una variable de entorno para que se pueda usar dentro de triplets y portfiles.

Por ejemplo, Directory.Build.props

<Project>
  <PropertyGroup>
    <VcpkgRoot>C:\dev\vcpkg\</VcpkgRoot>
    <MyProp Condition="'$(Platform)' == 'x64'">X64_VALUE</MyProp>
    <MyProp Condition="'$(Platform)' == 'x86'">X86_VALUE</MyProp>
  </PropertyGroup>
 <Import Project="$(VcpkgRoot)scripts\buildsystems\msbuild\vcpkg.props" />
</Project>

Por ejemplo, Directory.Build.targets

<Project>
  <Import Project="$(VcpkgRoot)scripts\buildsystems\msbuild\vcpkg.targets" />
  <Target Name="_SetVcpkgEnvVars" BeforeTargets="VcpkgTripletSelection">
    <Message Text="Setting MY_PROP to $(MyProp)" />
    <SetEnv Name="MY_PROP" Value="$(MyProp)" Prefix="false" />
  </Target>
</Project>

Triplete de ejemplo x64-windows-custom.cmake

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)

# Pass the environment variable to port builds
set(VCPKG_ENV_PASSTHROUGH_UNTRACKED MY_PROP)

Ejemplo de portfile.cmake

set(VCPKG_POLICY_EMPTY_PACKAGE enabled)

MESSAGE(STATUS "MY_PROP is $ENV{MY_PROP}")

Paquete NuGet vinculado

Note

Este enfoque no se recomienda para los nuevos proyectos, ya que dificulta su uso compartido con otros usuarios. Para obtener un paquete NuGet portátil y autónomo, consulte export command.

Los proyectos de VS también se pueden integrar a través de un paquete NuGet. Esto modificará el archivo de proyecto, por lo que no se recomienda este enfoque para los proyectos de código abierto.

PS D:\src\vcpkg> .\vcpkg integrate project
Created nupkg: D:\src\vcpkg\scripts\buildsystems\vcpkg.D.src.vcpkg.1.0.0.nupkg

With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
    Install-Package vcpkg.D.src.vcpkg -Source "D:/src/vcpkg/scripts/buildsystems"

Note

El paquete NuGet generado no contiene las bibliotecas reales. En su lugar, actúa como un acceso directo (o vínculo simbólico) a la instalación de vcpkg y se actualizará "automáticamente" con los cambios (instalar o quitar) en las bibliotecas. No es necesario volver a generar ni actualizar el paquete NuGet.

Configuración común

VcpkgEnabled (Usar Vcpkg)

Se puede establecer en "false" para deshabilitar explícitamente la integración de vcpkg para el proyecto.

VcpkgConfiguration (Configuración de Vcpkg)

Si los nombres de configuración son demasiado complejos para que vcpkg pueda adivinar correctamente, puede asignar esta propiedad a Release o Debug indicar explícitamente a vcpkg qué variante de bibliotecas desea consumir.

VcpkgEnableManifest (Usar el manifiesto de Vcpkg)

Esta propiedad debe establecerse en true para poder consumir desde un archivo local vcpkg.json. Si se establece en false, se omitirá cualquier archivo local vcpkg.json .

Actualmente, este valor predeterminado es false, pero lo hará true en el futuro.

VcpkgTriplet (Triplete)

Esta propiedad controla el triplete desde el que se consumirán bibliotecas, como x64-windows-static o arm64-windows.

Si no se establece explícitamente, vcpkg deducirá el triplete correcto en función de la configuración de Visual Studio. vcpkg solo deducirá los triples que usan la vinculación dinámica de la biblioteca y la vinculación dinámica de CRT; si desea dependencias estáticas o usar el CRT estático (/MT), deberá establecer el triplete manualmente.

Puede ver el triplete deducido automáticamente estableciendo el nivel de detalle de MSBuild en Normal o superior:

Acceso directo: Ctrl+Q "compilar y ejecutar"

Herramientas -> Opciones -> Proyectos y soluciones -> Compilar y ejecutar -> Nivel de detalle de la salida de compilación del proyecto de MSBuild

Consulte también Triplets

VcpkgHostTriplet (Triplete de host)

Esto se puede configurar como un triplete personalizado para resolver las dependencias del host.

Si no se establece, se usará por defecto el triplete "nativo" (x64-windows).

Consulte también Dependencias de host.

VcpkgInstalledDir (Directorio instalado)

Esta propiedad define la ubicación de vcpkg desde la que se instalarán y consumirán bibliotecas. Use VcpkgManifestInstalledBaseDir en una solución que use el modo de manifiesto y use varios tripletes.

En el modo de manifiesto, este valor predeterminado es $(VcpkgManifestRoot)\vcpkg_installed\$(VcpkgTriplet)\. En el modo clásico, este valor predeterminado es $(VcpkgRoot)\installed\.

VcpkgManifestInstalledBaseDir (Directorio base instalado)

Al usar el modo de manifiesto en la solución que compila varios triples, la configuración VcpkgInstalledDir puede ser callanging porque debe ser diferente para los proyectos que necesitan diferentes tripletas.

En este caso, se puede establecer que se puede establecer VcpkgManifestInstalledBaseDir globalmente y se anexa por el nombre de triplete.

VcpkgApplocalDeps (DLL implementadas localmente en la aplicación)

Esta propiedad habilita o deshabilita la detección y copia de las DLL dependientes desde el árbol de instalación de vcpkg al directorio de salida del proyecto. El valor predeterminado es true.

VcpkgXUseBuiltInApplocalDeps (Use el despliegue local integrado en la aplicación)

Esta propiedad controla qué implementación de despliegue de DLL locales de la aplicación usa vcpkg cuando VcpkgApplocalDeps está habilitado. El valor predeterminado es true, que usa la implementación integrada vcpkg z-applocal . Establézcalo en false para usar la implementación heredada de PowerShell applocal.ps1 .

Esta propiedad no tiene ningún efecto cuando $(VcpkgApplocalDeps) es false.

Configuración del modo de manifiesto

Para usar manifiestos (vcpkg.json) con MSBuild, primero debe usar uno de los métodos de integración anteriores. A continuación, agregue un archivo vcpkg.json por encima del archivo del proyecto (por ejemplo, en la raíz del repositorio de código fuente) y establezca la propiedad VcpkgEnableManifest en true. Puede establecer esta propiedad desde el IDE, en Propiedades del proyecto>Vcpkg>Usar el manifiesto de Vcpkg. Es posible que tenga que volver a cargar el IDE para ver la página de propiedades vcpkg.

vcpkg se ejecutará durante la compilación del proyecto e instalará las dependencias enumeradas en vcpkg_installed/$(VcpkgTriplet)/ adyacentes al vcpkg.json archivo; estas bibliotecas se incluirán automáticamente en los proyectos de MSBuild y se vincularán automáticamente a ellos.

Problemas conocidos

  • Visual Studio 2015 no realiza correctamente el seguimiento de las modificaciones en los archivos vcpkg.json y vcpkg-configuration.json, y no responderá a los cambios a menos que se edite un .cpp.

VcpkgAdditionalInstallOptions (Opciones adicionales)

Al usar un manifiesto, esta opción especifica marcas de línea de comandos adicionales para pasar a la invocación subyacente de la herramienta vcpkg. Esto se puede usar para acceder a las características que aún no se han expuesto a través de otra opción.

VcpkgManifestInstall (Instalar dependencias de Vcpkg)

Esta propiedad se puede establecer en false para deshabilitar la restauración automática de dependencias durante la compilación del proyecto. Las dependencias se deben restaurar manualmente a través de la línea de comandos vcpkg por separado.