vcpkg使用经验

缘起

由于某人之前用c++写了个项目,然后要引boost库(其实就为了个特殊函数),非常麻烦,然后折腾搞vcpkg了,这里把一些经验和大家分享吧。

vcpkg安装与下载

打开vcpkg官网,可以看到Windows、Linux和Mac版安装指南,照上面安装。(因为我没有mac,所以可能要自己读官网文档)

需要安装git和该平台c++编译器(Windows-VS,Linux-g++)。

Windows:

git clone https://github.com/Microsoft/vcpkg.git
.\vcpkg\bootstrap-vcpkg.bat -disableMetrics

Linux

git clone https://github.com/Microsoft/vcpkg.git
./vcpkg/bootstrap-vcpkg.sh -disableMetrics

安装包

一般安装本平台默认包,直接输入(以boost为例):

./vcpkg install boost

Windows是x86-windows(今年改成x64-windows),Linux是x64-linux(都是动态库)。

覆盖初始triplet

现在一般Windows也是64位了,所以一般需要设置环境变量:

VCPKG_DEFAULT_TRIPLET = x64-windows

假如只是临时需要安装其他triplet,可以输入:

./vcpkg install boost --triplet=x64-windows-static

或者

./vcpkg install boost:x64-windows-static

Android(安卓)环境变量设置

编译Android版库,需要设置ANDROID_NDK_HOME环境变量:

export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r21b

一些常用命令

  1. ./vcpkg list xxx:列出已安装包中的xxx,未输入xxx则列出全部;
  2. ./vcpkg search xxx:搜索已安装包中的xxx
  3. ./vcpkg remove xxx:卸载已安装包中的xxx
  4. git pull && ./vcpkg update:更新vcpkg并检查包更新。

覆盖triplet

有时候要指定编译器和对应标准库怎么办呢,完整地更改一般比较麻烦,可以采用覆盖默认triplet的方法,以Linux clang为例。

mkdir custom-triplets
cp vcpkg/triplets/x64-linux.cmake custom-triplets/x64-linux-dynamic.cmake
mv custom-triplets/x64-linux-dynamic.cmake custom-triplets/x64-linux.cmake
cp vcpkg/triplets/x64-linux.cmake custom-triplets/x64-linux-clang.cmake

并修改custom-triplets/x64-linux-clang.cmake以匹配以下内容:

# ~/git/custom-triplets/x64-linux-clang.cmake
set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)

set(VCPKG_CMAKE_SYSTEM_NAME Linux)
set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "custom-triplets/clang-toolchain.cmake") #记得改成绝对路径

并创建custom-triplets/clang-toolchain.cmake

set(CMAKE_C_COMPILER "/usr/bin/clang")
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")

最后输入:(这一步要在custom-triplets的上一级文件夹进行)

./vcpkg install boost:x64-linux-clang --overlay-triplets=custom-triplets

我用的自定义triplet

GitHub仓库和同步的Gitee仓库

一些已知的坑

Mingw

Mingw没有Python和有关包,因为Python官方并不支持Mingw,见此issue

boost

boost库不能直接输入./vcpkg remove boost,而应该是./vcpkg remove boost-uninstall

Bug和其他问题提交

Github vcpkg仓库提issue,官方triplet会及时修bug,社区triplet要足够详细。Port没更新提一下几天之内就会更新。

更多vcpkg可见微软官网教程