C ++ ainda é usado não apenas para escrever sistemas operacionais, jogos e drivers, mas também para utilitários de linha de comando que consomem muitos recursos. Enquanto isso, os concorrentes nessa área, como o Rust, oferecem um sistema de construção com um gerenciador de dependência padrão. Para C ++, de fato, há também um sistema de compilação CMake padrão, mas como conectar bibliotecas externas sem dor? Lembre-se de que, para muitas tecnologias avançadas, existe algo como uma página https://start.yourtechnology.io que cria um projeto padrão básico para não perder tempo com configurações padronizadas. Este artigo discute esse padrão para criar projetos C ++ com o gerenciador de dependência vcpkg.
Por que vcpkg?
Primeiro, devido ao desejo de simplificar o projeto base o máximo possível e reduzir o número de arquivos de configuração nele. Para C ++, existe outro gerenciador de pacotes avançado Conan , mas requer a adição de um arquivo conanfile.txt
, e o vcpkg gerencia um padrão CMakeLists.txt
. Em segundo lugar, o vcpkg está bem estabelecido e tem suporte estável da Microsoft.
1. Configurando o conjunto de ferramentas para o trabalho
Em primeiro lugar, precisamos do CMake e do próprio gerenciador de dependência vcpkg, você pode instalá-lo por meio de seu gerenciador de pacotes favorito (por exemplo brew install vcpkg
) ou compilá-lo manualmente a partir daqui .
2. Instalando dependências
Verifique se a biblioteca necessária está disponível
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++ . !