vcpkg en proyectos de CMake
vcpkg ofrece una integración perfecta con CMake para que los paquetes instalados estén disponibles automáticamente en los proyectos. El mecanismo en el que se integra vcpkg es proporcionando un archivo de cadena de herramientas de CMake.
La primera vez que CMake configura un proyecto, ejecuta rutinas de búsqueda internas para buscar una cadena de herramientas viable (compilador, enlazador, etc.). Esta búsqueda se produce dentro de la project()
función en CMakeLists.txt
.
Para personalizar el proceso de selección de cadenas de herramientas, CMake admite el uso de scripts de lenguaje CMake personalizados, conocidos como archivos de cadena de herramientas. Se especifica un archivo de cadena de herramientas estableciendo la CMAKE_TOOLCHAIN_FILE
variable . CMake evalúa el contenido del script de cadena de herramientas proporcionado y establece definiciones de variables, rutas de acceso a las herramientas de compilación necesarias y otros parámetros de compilación, como marcas de compilación cruzadas, en consecuencia.
Cuando se establece CMAKE_TOOLCHAIN_FILE
para usar la cadena de herramientas vcpkg (<vcpkg-root>/scripts/buildsystems/vcpkg.cmake
), vcpkg aprovecha el mecanismo de archivo de cadena de herramientas para insertar código para integrar con funciones CMake integradas de forma transparente.
Todavía puede usar un archivo de cadena de herramientas para configurar sus propios conjuntos de herramientas mediante la VCPKG_CHAINLOAD_TOOLCHAIN_FILE
variable triplet.
La integración de vcpkg funciona de forma diferente en función del modo de operación que use:
En el modo clásico, vcpkg establece las rutas de búsqueda de CMake adecuadamente para que los paquetes instalados estén disponibles a través de las find_package()
funciones , find_library()
y find_path()
.
En el modo de manifiesto, además de lo anterior, la cadena de herramientas detecta archivos de manifiesto (vcpkg.json
archivos) y se ejecuta vcpkg install
para adquirir automáticamente las dependencias del proyecto.
Dado que el archivo de cadena de herramientas se evalúa durante la project()
llamada, todas las variables de nivel de CMake que modifican una configuración de vcpkg deben establecerse antes de la primera llamada a project()
. También puede ser necesario volver a configurar el proyecto de CMake si modifica cualquier configuración de vcpkg que produzca cambios hash de ABI .
Consulte Ejemplo de instalación y uso de paquetes: sqlite para ver un ejemplo totalmente trabajado con CMake.
CMAKE_TOOLCHAIN_FILE
Nota:
Si establece CMAKE_TOOLCHAIN_FILE
en CMakeList.txt
el archivo, asegúrese de que la variable está establecida antes de cualquier llamada a project()
.
Los proyectos configurados para usar el archivo de cadena de herramientas vcpkg (a través del valor CMAKE_TOOLCHAIN_FILE
de CMake ) pueden encontrar bibliotecas de vcpkg mediante las funciones estándar de CMake: find_package()
, find_path()
y find_library()
.
Se recomienda usar valores preestablecidos de CMake para especificar el archivo de cadena de herramientas. Por ejemplo, si ha definido la variable VCPKG_ROOT
de entorno , puede usar lo siguiente CMakePresets.json
y pasar --preset debug
la línea de configuración:
{
"version": 2,
"configurePresets": [
{
"name": "debug",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
}
}
]
}
cmake -B build -S /my/project --preset debug
Si necesita usar una ruta de acceso absoluta para vcpkg específico de la máquina actual, puede usar CMakeUserPresets.json
y agregarla al .gitignore
archivo.
{
"version": 2,
"configurePresets": [
{
"name": "debug",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
}
}
]
}
Las versiones de CMake anteriores a la 3.19 deben pasar el archivo de cadena de herramientas en la línea de comandos de configuración:
cmake ../my/project -DCMAKE_TOOLCHAIN_FILE=<vcpkg-root>/scripts/buildsystems/vcpkg.cmake
Uso de bibliotecas
vcpkg admite los mecanismos nativos de CMake para buscar bibliotecas: find_package()
, find_library()
y find_path()
. Al instalar bibliotecas con compatibilidad específica con CMake, vcpkg mostrará información de uso sobre cómo consumir la biblioteca:
The package zlib is compatible with built-in CMake targets:
find_package(ZLIB REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB)
vcpkg no agrega automáticamente ninguna ruta de acceso de inclusión o vínculos al proyecto. Para usar una biblioteca de solo encabezado, puede usar find_path()
la que funcionará correctamente en todas las plataformas:
# To find and use catch2
find_path(CATCH_INCLUDE_DIR NAMES catch.hpp PATH_SUFFIXES catch2)
target_include_directories(main PRIVATE ${CATCH_INCLUDE_DIR})
Integración del IDE
Visual Studio/Visual Studio Code
Se recomienda usar valores preestablecidos de CMake en Visual Studio y Visual Studio Code.
Obtenga más información en Configuración y compilación con valores preestablecidos de CMake en Visual Studio y Configuración y compilación con valores preestablecidos de CMake en Visual Studio Code.
CLion
Abra la configuración de cadenas de herramientas (File > Settings
en Windows y Linux, CLion > Preferences
en macOS) y vaya a la configuración de CMake (Build, Execution, Deployment > CMake
). En CMake options
, agregue la siguiente línea:
-DCMAKE_TOOLCHAIN_FILE=<vcpkg-root>/scripts/buildsystems/vcpkg.cmake
Debe agregar esta línea a cada perfil por separado.
Uso de varios archivos de cadena de herramientas
Para combinar el archivo de cadena de herramientas de vcpkg con otro archivo de cadena de herramientas, puede establecer la variable VCPKG_CHAINLOAD_TOOLCHAIN_FILE
de caché de CMake :
cmake ../my/project \
-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=../my/project/toolchain.cmake
Como alternativa, puede incluir la cadena de herramientas vcpkg al final del archivo de cadena de herramientas principal:
# MyToolchain.cmake
set(CMAKE_CXX_COMPILER ...)
set(VCPKG_TARGET_TRIPLET x64-my-custom-windows-triplet)
include(/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake)
Nota:
vcpkg no aplica automáticamente la configuración de la cadena de herramientas, como el compilador o las marcas de compilación, al compilar bibliotecas. Para cambiar la configuración de la biblioteca de vcpkg, debe crear un archivo triplet personalizado (que puede compartir la cadena de herramientas)**
Referencia de configuración
Todas las variables que afectan a vcpkg deben definirse antes de la primera project()
directiva, como en un CMakePresets.json
mapa de , a través de "cacheVariables"
la línea de comandos o set()
las instrucciones .
VCPKG_TARGET_TRIPLET
Esta configuración controla el vcpkg triplet desde el que se instalarán y consumirán bibliotecas.
Si no se establece, vcpkg detectará automáticamente un triplet predeterminado adecuado según la configuración actual del compilador. Si cambia esta variable de CMake, debe eliminar la memoria caché y volver a configurarla.
VCPKG_HOST_TRIPLET
Esta variable controla las dependencias de host triples para las que se instalarán.
Si no se establece, vcpkg detectará automáticamente un triplet nativo adecuado (x64-windows, x64-osx, x64-linux).
Consulte también Dependencias de host.
VCPKG_INSTALLED_DIR
Esta variable establece la ubicación desde la que se instalarán y consumirán las bibliotecas.
En el modo de manifiesto, el valor predeterminado es ${CMAKE_BINARY_DIR}/vcpkg_installed
.
En el modo clásico, el valor predeterminado es ${VCPKG_ROOT}/installed
.
VCPKG_MANIFEST_MODE
Esta variable fuerza a vcpkg a operar en modo de manifiesto o en modo clásico.
El valor predeterminado es ON
cuando VCPKG_MANIFEST_DIR
no está vacío o ${CMAKE_SOURCE_DIR}/vcpkg.json
existe.
Para deshabilitar el modo de manifiesto mientras se detecta un vcpkg.json
, establezca este valor en OFF
.
VCPKG_MANIFEST_DIR
Esta variable especifica una carpeta alternativa que contiene un vcpkg.json
manifiesto.
El valor predeterminado es ${CMAKE_SOURCE_DIR}
si ${CMAKE_SOURCE_DIR}/vcpkg.json
existe.
VCPKG_MANIFEST_INSTALL
Esta variable controla si vcpkg se ejecutará automáticamente para instalar las dependencias durante el paso de configuración.
El valor predeterminado es ON
si VCPKG_MANIFEST_MODE
es ON
.
VCPKG_BOOTSTRAP_OPTIONS
Esta variable se puede establecer en parámetros de comando adicionales para pasar a ./bootstrap-vcpkg
.
En el modo de manifiesto, vcpkg se arrancará automáticamente si el ejecutable no existe.
VCPKG_OVERLAY_TRIPLETS
Esta variable se puede establecer en una lista de rutas de acceso que se van a pasar en la línea de comandos como --overlay-triplets=...
VCPKG_OVERLAY_PORTS
Esta variable se puede establecer en una lista de rutas de acceso que se van a pasar en la línea de comandos como --overlay-ports=...
VCPKG_MANIFEST_FEATURES
Esta variable se puede establecer en una lista de características que se van a activar al instalar desde el manifiesto.
Por ejemplo, los proyectos pueden usar características para controlar la compilación con dependencias adicionales para habilitar pruebas o ejemplos:
{
"name": "mylibrary",
"version": "1.0",
"dependencies": [ "curl" ],
"features": {
"samples": {
"description": "Build Samples",
"dependencies": [ "fltk" ]
},
"tests": {
"description": "Build Tests",
"dependencies": [ "gtest" ]
}
}
}
Este valor se puede controlar directamente mediante valores preestablecidos de CMake con "cacheVariables"
o indirectamente en función de otras configuraciones:
# CMakeLists.txt
option(BUILD_TESTING "Build tests" OFF)
if(BUILD_TESTING)
list(APPEND VCPKG_MANIFEST_FEATURES "tests")
endif()
option(BUILD_SAMPLES "Build samples" OFF)
if(BUILD_SAMPLES)
list(APPEND VCPKG_MANIFEST_FEATURES "samples")
endif()
project(myapp)
# ...
VCPKG_MANIFEST_NO_DEFAULT_FEATURES
Esta variable controla la activación de características predeterminadas además de las enumeradas en VCPKG_MANIFEST_FEATURES
. Si se establece en ON
, las características predeterminadas no se activarán automáticamente.
Tiene como valor predeterminado OFF
.
VCPKG_INSTALL_OPTIONS
Esta variable se puede establecer en una lista de parámetros de línea de comandos adicionales para pasar a la herramienta vcpkg durante la instalación automática.
VCPKG_PREFER_SYSTEM_LIBS
Advertencia
Esta característica ha quedado en desuso. En su lugar, use puertos de superposición vacíos.
Esta variable controla si vcpkg anexará en lugar de anteponer sus rutas de acceso a CMAKE_PREFIX_PATH
, CMAKE_LIBRARY_PATH
de modo que las bibliotecas o CMAKE_FIND_ROOT_PATH
paquetes de vcpkg se encuentren después de la cadena de herramientas,las bibliotecas o paquetes del sistema.
Tiene como valor predeterminado OFF
.
VCPKG_FEATURE_FLAGS
Esta variable se puede establecer en una lista de marcas de características para pasar a la herramienta vcpkg durante la instalación automática para participar en el comportamiento experimental.
Consulte la opción de --feature-flags=
línea de comandos para obtener más información.
VCPKG_TRACE_FIND_PACKAGE
Cuando se establece en ON
, imprima cada llamada a find_package
. Las llamadas anidadas (por ejemplo, a través find_dependency
de ) se aplican sangría según la profundidad de anidamiento.