Instalando e usando pacotes Exemplo: SQLite
Observação
Este exemplo antigo usa o modo Clássico, mas a maioria dos desenvolvedores ficará mais feliz com o modo Manifesto. Consulte Modo de manifesto: exemplo de CMake para obter um exemplo de conversão para o modo de manifesto.
Etapa 1: instalar
Primeiro, precisamos saber qual nome o SQLite usa na árvore de ports. Para fazer isso, executaremos o search
comando e inspecionaremos a saída:
PS D:\src\vcpkg> .\vcpkg search sqlite
libodb-sqlite 2.4.0 Sqlite support for the ODB ORM library
sqlite3 3.32.1 SQLite is a software library that implements a se...
If your library is not listed, please open an issue at:
https://github.com/Microsoft/vcpkg/issues
Olhando para a lista, podemos ver que a porta é chamada de "sqlite3". Você também pode executar o search
comando sem argumentos para ver a lista completa de pacotes.
A instalação é tão simples quanto usar o install
comando.
PS D:\src\vcpkg> .\vcpkg install sqlite3
Computing installation plan...
The following packages will be built and installed:
sqlite3[core]:x86-windows
Starting package 1/1: sqlite3:x86-windows
Building package sqlite3[core]:x86-windows...
-- Downloading https://sqlite.org/2020/sqlite-amalgamation-3320100.zip...
-- Extracting source C:/src/vcpkg/downloads/sqlite-amalgamation-3320100.zip
-- Applying patch fix-arm-uwp.patch
-- Using source at C:/src/vcpkg/buildtrees/sqlite3/src/3320100-15aeda126a.clean
-- Configuring x86-windows
-- Building x86-windows-dbg
-- Building x86-windows-rel
-- Performing post-build validation
-- Performing post-build validation done
Building package sqlite3[core]:x86-windows... done
Installing package sqlite3[core]:x86-windows...
Installing package sqlite3[core]:x86-windows... done
Elapsed time for package sqlite3:x86-windows: 12 s
Total elapsed time: 12.04 s
The package sqlite3:x86-windows provides CMake targets:
find_package(unofficial-sqlite3 CONFIG REQUIRED)
target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3))
Podemos verificar se o sqlite3 foi instalado com sucesso para a área de trabalho x86 do Windows executando o list
comando.
PS D:\src\vcpkg> .\vcpkg list
sqlite3:x86-windows 3.32.1 SQLite is a software library that implements a se...
Para instalar em outras arquiteturas e plataformas, como a Plataforma Universal do Windows ou o x64 Desktop, você pode sufixar o nome do pacote com :<target>
.
PS D:\src\vcpkg> .\vcpkg install sqlite3:x86-uwp zlib:x64-windows
Consulte .\vcpkg help triplet
para todos os destinos suportados.
Passo 2: Use
Projeto VS/MSBuild (integração em todo o usuário)
A maneira recomendada e mais produtiva de usar o vcpkg é por meio da integração de todo o usuário, disponibilizando o sistema para todos os projetos que você cria. A integração de todo o usuário solicitará acesso de administrador na primeira vez que for usada em uma determinada máquina, mas depois não será mais necessária e a integração será configurada por usuário.
PS D:\src\vcpkg> .\vcpkg integrate install
Applied user-wide integration for this vcpkg root.
All C++ projects can now #include any installed libraries.
Linking will be handled automatically.
Installing new libraries will make them instantly available.
Observação
Você precisará reiniciar o Visual Studio ou executar um Build para atualizar o IntelliSense com as alterações.
Agora você pode simplesmente usar Arquivo –> Novo Projeto no Visual Studio e a biblioteca estará disponível automaticamente. Para SQLite, você pode experimentar o exemplo C/C++.
Para remover a integração do usuário, você pode usar .\vcpkg integrate remove
o .
CMake (arquivo de cadeia de ferramentas)
A melhor maneira de usar as bibliotecas instaladas com o cmake é por meio do arquivo scripts\buildsystems\vcpkg.cmake
do conjunto de ferramentas. Para usar este arquivo, basta adicioná-lo à linha de comando do CMake como:
-DCMAKE_TOOLCHAIN_FILE=D:\src\vcpkg\scripts\buildsystems\vcpkg.cmake
.
Se você estiver usando o CMake por meio de Abrir Pasta com o Visual Studio, poderá definir CMAKE_TOOLCHAIN_FILE
adicionando uma seção "variáveis" a cada uma de suas CMakeSettings.json
configurações:
{
"configurations": [{
"name": "x86-Debug",
"generator": "Visual Studio 15 2017",
"configurationType" : "Debug",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "-m -v:minimal",
"variables": [{
"name": "CMAKE_TOOLCHAIN_FILE",
"value": "D:\\src\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake"
}]
}]
}
Observação
Pode ser necessário excluir a pasta de cache do CMake de cada configuração modificada para forçar uma regeneração completa. CMake
No menu, em Cache (<configuration name>)
você encontrará Delete Cache Folders
.
Agora vamos fazer um projeto CMake simples com um arquivo principal.
# CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(test)
find_package(unofficial-sqlite3 CONFIG REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3)
// main.cpp
#include <sqlite3.h>
#include <stdio.h>
int main()
{
printf("%s\n", sqlite3_libversion());
return 0;
}
Em seguida, construímos nosso projeto da maneira normal do CMake:
PS D:\src\cmake-test> mkdir build
PS D:\src\cmake-test> cd build
PS D:\src\cmake-test\build> cmake .. "-DCMAKE_TOOLCHAIN_FILE=D:\src\vcpkg\scripts\buildsystems\vcpkg.cmake"
// omitted CMake output here //
-- Build files have been written to: D:/src/cmake-test/build
PS D:\src\cmake-test\build> cmake --build .
// omitted MSBuild output here //
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:02.38
PS D:\src\cmake-test\build> .\Debug\main.exe
3.15.0
Observação
O sqlite3.dll correto é copiado automaticamente para a pasta de saída ao compilar para x86-windows. Você precisará distribuir isso junto com seu aplicativo.
Manipulando bibliotecas sem suporte nativo ao cmake
Ao contrário de outras plataformas, não adicionamos automaticamente o include\
diretório à sua linha de compilação por padrão. Se você estiver usando uma biblioteca que não fornece integração com o CMake, precisará pesquisar explicitamente os arquivos e adicioná-los usando find_path()
e find_library()
.
# To find and use catch
find_path(CATCH_INCLUDE_DIR catch.hpp)
target_include_directories(main PRIVATE ${CATCH_INCLUDE_DIR})
# To find and use azure-storage-cpp
find_path(WASTORAGE_INCLUDE_DIR was/blob.h)
find_library(WASTORAGE_LIBRARY wastorage)
target_include_directories(main PRIVATE ${WASTORAGE_INCLUDE_DIR})
target_link_libraries(main PRIVATE ${WASTORAGE_LIBRARY})