体验一下cpp的包管理工具vcpkg的使用,git地址。vcpkg是Microsoft的跨平台开源软件包的管理器,极大的简化了在不同平台上第三方库的安装。如果项目要使用第三方库,建议通过 vcpkg 来安装它们。vcpkg 同时支持开源和专有库。微软对其的介绍可以查看地址。我们在做cpp的开发时,经常会使用到第三方的库,在编译这些时我们要做哪些考虑呢?比如:Debug还是Release、动态库还是静态库、MD还是MT、32位还是64位。光是这三种组合就有16种可能性。如果像libcurl这种还要考虑是否引用其他开源库的功能,那么编译类型的组合会更多。管理起来很麻烦。由于多样的编译类型,工程目录也必须仔细设定才能保证自己的软件项目能够正常编译。
使用vcpkg的优点:
- 自动下载开源库源代码
- 源码包的缓存管理和版本管理,可以升级版本
- 轻松编译
- 依赖关系检查(比如编译libcurl,会自动下载zlib、openssl进行编译)
- 无缝集成Visual Studio,不需要设置库文件、头文件的所在目录,自动集成。
- Visual Studio全平台支持,不仅支持Debug/Release、x86/x64编译,还支持UWP、ARM平台的编译。
Ubuntu下部署
依赖软件
- git
- g++ >=6
依赖工具
sudo apt-get update
sudo apt-get install build-essential tar curl zip unzip安装
安装过程可以参考地址。如果电脑中没有安装cmake,vcpkg会自动下载portable版本的cmake。但是由于各种原因,下载的网速很慢,所以建议先自行下载安装msi版本的cmake。最好是下载最新版本的cmake。
git clone https://github.com/microsoft/vcpkg./vcpkg/bootstrap-vcpkg.sh安装成功后会在当前vcpkg的目录下产生一个vcpkg的命令行的工具。
目录结构
所有 vcpkg 功能和数据都自包含在实例的单独目录层次结构中。 没有注册表设置或环境变量。 可以在一台计算机上设置任意数量的 vcpkg 实例,它们彼此互不干扰。
vcpkg 实例的内容如下:
buildtrees- 包含从中生成每个库的源的子文件夹。docs- 文档和示例。downloads- 所有已下载的工具或源的缓存副本。 运行安装命令时,vcpkg 会首先搜索此处。installed- 包含每个已安装库的标头和二进制文件。 与 Visual Studio 集成时,实质上是相当于告知它将此文件夹添加到其搜索路径。packages- 在不同的安装之间用于暂存的内部文件夹。ports- 用于描述每个库的目录、版本和下载位置的文件。 如有需要,可添加自己的端口。scripts- 由 vcpkg 使用的脚本(CMake、PowerShell)。toolsrc- vcpkg 和相关组件的 C++ 源代码。triplets- 包含每个受支持目标平台(如 x86-windows 或 x64-uwp)的设置。
更新
vcpkg 包管理器在 GitHub 上定期更新。 若要将 vcpkg 的克隆更新到最新版本,请从 vcpkg 根目录运行 git pull。 此命令会将 vcpkg 的副本与 GitHub 上的版本同步。 下载完成后,再次运行引导程序。 引导程序会重新生成 vcpkg 程序,但保留已安装的库。
卸载
若要卸载 vcpkg,只需删除 vcpkg 目录。 删除此目录会卸载 vcpkg 分发以及 vcpkg 已安装的所有库。
但是,如果已执行 vcpkg integrate install,则应执行 vcpkg integrate remove 来确保在删除文件夹之前已清理集成 。 有关详细信息,请参阅集成 vcpkg。这个是Windows下集成到IDE使用的,在Linux下开发的不用关心。
命令行使用
记录一下常用的命令行。具体的命令行的使用可以参考地址
search
您也可以使用 search 子命令来查找vcpkg中已集成的库。
./vcpkg/vcpkg search [search term] 您也可以查看具体的某个包
./vcpkg/vcpkg search uuidinstall
使用以下命令安装任意包。linux下默认编译生成的是静态库。
./vcpkg/vcpkg install [packages to install]指定编译某种架构的程序库
如果不指定安装的架构,vcpkg默认把开源库编译成x86的Windows版本的库。那vcpkg总共支持多少种架构呢?我们可以使用如下命令便知:
./vcpkg/vcpkg help triplet vcpkg不仅支持x86架构,还支持arm架构。注意:这里的arm架构特指类似于surface这种运行在arm处理器上的Win10平台,而并非我们传统意义上的Linux或android的ARM平台。那如果要安装编译某一个架构的开源库,我们该怎么写呢?我们只需要在需要安装的包后面指定相应的triplet即可。例如我们需要编译64位版本的jsoncpp,那么执行如下命令即可。
./vcpkg/vcpkg install jsoncpp:x64-linux 例如安装uuid,先用search命令查找具体的包的名字,然后在使用install进行安装。
./vcpkg/vcpkg search uuid
./vcpkg/vcpkg install libuuid动态库编译
Linux平台默认编译的是静态库,如果要编译动态库则可以参照这篇文章
list
查看已经安装的开源库。
./vcpkg/vcpkg listremove
移除一个已经安装的库。 如果有其他库依赖它,系统会提示你使用 --recurse 重新运行命令;重新运行会导致下游的所有库都被删除。
./vcpkg/vcpkg remove libuuidupgrade
公共目录始终与最新版本的库保持一致。 要判断哪个本地库已过期,请使用 vcpkg update。 准备好将端口集合更新到最新版本的公共目录后,请运行 vcpkg upgrade 命令。 它会自动下载并重新生成已过期的任意或所有已安装的库。
默认情况下,vcpkg upgrade 命令仅列出过期库,不对它们进行升级。 若要真正升级这些库,请使用 --no-dry-run 选项。
vcpkg upgrade --no-dry-run升级选项:
--no-dry-run:执行升级;若未指定,该命令将仅列出过期的包。--keep-going:继续安装包(即使某项失败)。--triplet <t>:为非限定的包设置默认的三元组。--vcpkg-root <path>:指定要使用的 vcpkg 目录,而不是使用当前目录或工具目录。
export
导出一个安装好的包。
./vcpkg/vcpkg export jsoncpp --zip注意,导出时必须指定导出的包格式。vcpkg支持5种导出包格式,有:
| 参数 | 格式 |
|---|---|
| –raw | 以不打包的目录格式导出 |
| –nuget | 以nuget包形式导出 |
| –ifw | 我也不知道这是啥格式 |
| –zip | 以zip压缩包形式导出 |
| –7zip | 以7z压缩包形式导出 |
如果要指定输出目录和特定文件名,需使用”–output=”参数
import
导入一个包
./vcpkg/vcpkg import xxx.zipcmake
和cmake配合使用可以通过下面的命令。这个是需要在命令行中输入。
-DCMAKE_TOOLCHAIN_FILE="/home/helios/work/source/vcpkg/scripts/buildsystems/vcpkg.cmake" 另一种方法是直接在项目顶层的CMakeLists.txt中设置变量,必须在project参数设置之前设置下面的参数。在需要使用的地方通过find_package既可以。
- CMAKE_TOOLCHAIN_FILE 你的vcpkg.cmake的路径;
- VCPKG_TARGET_TRIPLET 你的平台架构名字,通过
./vcpkg/vcpkg help tripl来查看
set(CMAKE_TOOLCHAIN_FILE /home/helios/work/source/vcpkg/scripts/buildsystems/vcpkg.cmake CACHE PATH "")
#set(VCPKG_TARGET_TRIPLET x64-linux CACHE PATH "") 对于你安装的软件,执行install之后会告诉你怎么在camke中使用,例如下面的:
The package sqlite3:x64-linux provides CMake targets:
find_package(unofficial-sqlite3 CONFIG REQUIRED)
target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3)) 最后一种方法,直接在cmake文件中添加其头文件和动态库的地址。
实例
官网介绍了一个例子,可以用于学习,地址。
评论