C ++ con multiplataforma y dependencias

C ++ todavía se usa no solo para escribir sistemas operativos, juegos y controladores, sino también para utilidades de línea de comandos que consumen muchos recursos. Mientras tanto, los competidores en este campo, como Rust, ofrecen un sistema de compilación con un administrador de dependencias predeterminado. Para C ++, de facto, también hay un sistema de compilación CMake estándar, pero ¿cómo conectar bibliotecas externas sin problemas? Recuerde que para muchas tecnologías avanzadas existe algo así como una página https://start.yourtechnology.io que crea un proyecto estándar básico para no perder tiempo en la configuración estándar. Este artículo analiza este patrón para crear proyectos C ++ con el administrador de dependencias vcpkg.





¿Por qué vcpkg?

Primero, debido al deseo de simplificar el proyecto base tanto como sea posible y reducir la cantidad de archivos de configuración que contiene. Para C ++, hay otro administrador de paquetes avanzado, Conan , pero requiere agregar un archivo conanfile.txt



, y vcpkg administra uno estándar CMakeLists.txt



. En segundo lugar, vcpkg está bien establecido y cuenta con un soporte estable de Microsoft.





1. Configuración de la cadena de herramientas para el trabajo

En primer lugar, necesitamos CMake y el propio administrador de dependencias vcpkg, puede instalarlo a través de su administrador de paquetes favorito (por ejemplo brew install vcpkg



) o compilarlo manualmente desde aquí .





2. Instalación de dependencias

Compruebe si la biblioteca requerida está disponible

vcpkg search yourdepname





Instalar

vcpkg install yourdepname







, , , , vcpkg . , , :

vcpkg install catch2

vcpkg install cli11

vcpkg install fmt








, , vcpkg CMakeLists.txt







CMakeLists.txt



? , vcpkg:





cmake_minimum_required(VERSION 3.17)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(proj)
file(GLOB proj_sources src/*.cpp)
add_executable(proj ${proj_sources})
find_package(fmt CONFIG REQUIRED)
target_link_libraries(proj PRIVATE fmt::fmt fmt::fmt-header-only)
find_package(CLI11 CONFIG REQUIRED)
target_link_libraries(proj PRIVATE CLI11::CLI11)

project(test)
#[[Changing the entry point for tests]]
list(FILTER proj_sources EXCLUDE REGEX ".*Main.cpp$")
file(GLOB test_sources test/*.cpp)
add_executable(test ${proj_sources} ${test_sources})
find_package(Catch2 CONFIG REQUIRED)
target_link_libraries(test PRIVATE Catch2::Catch2)
target_link_libraries(test PRIVATE CLI11::CLI11)
target_link_libraries(test PRIVATE fmt::fmt fmt::fmt-header-only)
      
      



3.

, CMake , ? IDE, CMake options vcpkg integrate install





IDE , CMake :





cmake `vcpkg integrate install | tail -1 | cut -d \"` -f2 -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -B cmake-build-release
      
      



Windows, `` , vcpkg integrate install





, :

cmake --build cmake-build-release --target all









vcpkg install [...]



.



++ 21 . GitHub , . , "Use this template"  .

c C++ . !








All Articles