C ++ avec multiplateforme et dépendances

C ++ est toujours utilisé non seulement pour l'écriture de systèmes d'exploitation, de jeux et de pilotes, mais également pour les utilitaires de ligne de commande gourmands en ressources. Pendant ce temps, les concurrents dans ce domaine, tels que Rust, proposent un système de construction avec un gestionnaire de dépendances par défaut. Pour C ++, de facto, il existe également un système de construction CMake standard, mais comment connecter des bibliothèques externes sans douleur? Rappelez-vous que pour de nombreuses technologies avancées, il existe quelque chose comme une page https://start.yourtechnology.io qui crée un projet standard de base afin de ne pas perdre de temps sur une configuration passe-partout. Cet article décrit un tel modèle pour la création de projets C ++ avec le gestionnaire de dépendances vcpkg.





Pourquoi vcpkg?

Tout d'abord, parce que vous souhaitez simplifier au maximum le projet de base et réduire le nombre de fichiers de configuration qu'il contient. Pour C ++, il existe un autre gestionnaire de packages avancé Conan , mais il nécessite l'ajout d'un fichier conanfile.txt



et vcpkg en gère un standard CMakeLists.txt



. Deuxièmement, vcpkg est bien établi et bénéficie d'un support stable de Microsoft.





1. Configuration de la chaîne d'outils pour le travail

Tout d'abord, nous avons besoin de CMake et du gestionnaire de dépendances vcpkg lui-même, vous pouvez l'installer via votre gestionnaire de paquets préféré (par exemple brew install vcpkg



), ou le construire manuellement à partir d'ici .





2. Installation des dépendances

Vérifiez si la bibliothèque requise est disponible

vcpkg search yourdepname





Installer

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