接触了vcpkg一段时间, 感觉在包管理方面确实很有帮助, 然而在使用中, 也碰到了各种各样的问题, 总结记录一下.
vcpkg github: https://github.com/Microsoft/vcpkg
快速使用指南
To get started:
> git clone https://github.com/Microsoft/vcpkg.git(也可以从下载地址直接下载安装包压缩文件, 建议使用git, 后面会用到)
> cd vcpkg
Windows> .\bootstrap-vcpkg.bat
Linux:~/$ ./bootstrap-vcpkg.sh
Then, to hook up user-wide integration, run (note: requires admin on first use)
Windows> .\vcpkg integrate install
Linux:~/$ ./vcpkg integrate install
Install any packages with
Windows> .\vcpkg install sdl2 curl
Linux:~/$ ./vcpkg install sdl2 curl
常见错误汇总
windows
1. .\vcpkg integrate install失败,报错 Error: failed to copy targets file to C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\ImportBefore\Default\vcpkg.system.props
原因:如果以管理员身份打开cmd后出现这个报错,是因为Default目录下面没有vcpkg.system.props文件夹,手动创建该文件夹后操作成功。
猜测根本原因:看这一句requires admin on first use,意思应该是在编译的时候就以管理员身份打开cmd,这样就不会出现上面的错误,目前按照这个做法还没有出现上面的错误
Linux
1. ./bootstrap-vcpkg.sh失败
此脚本首先会安装cMake,要安装cMake需要系统中有gcc-c++,而且版本不低于7,不然就会安装失败。常规yum安装(yum install gcc-c++)的安装版本可能会低于7,可以尝试:
On Ubuntu try the following:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
sudo apt-get update -y
sudo apt-get install g++-7 -y
On CentOS try the following:
sudo yum install centos-release-scl
sudo yum install devtoolset-7
scl enable devtoolset-7 bash
2. vcpkg需要git2.0以上版本,centOS下面yum安装默认都是1.0版本的,可以考虑下面的方式:
yum install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
yum install git
如果再bower时出现SSL connect error,执行 git config --global http.sslversion tlsv1
3. ./vcpkg integrate install 报错: write_contents("/root/.vcpkg/vcpkg.path.txt"): No such file or directory.
可能脚本没有权限创建这个目录导致的错误, 可以手动创建这个目录, 再创建这个文件解决:
mkdir /root/.vcpkg
touch /root/.vcpkg/vcpkg.path.txt
然后再重新执行所有安装命令
4. ./vcpkg install package时报错: error: vcpkg was unable to detect the active compiler's information. See above for the CMake failure output.
可能的原因是需要系统中有gcc-c++,而且版本不低于7, 然后安装过后不会默认启用, 所以可以先手动执行一下命令 scl enable devtoolset-7 bash 来启用它. 然后 scl enable devtoolset-7 bash似乎只能支持当前连接,关闭重开后就失效了,需要重新输入,看看怎么能够默认启用吧.
使用问题
1. 如何安装指定版本的包
想要安装指定版本的包, 需要把你的vcpkg仓库checkout到和这个包相符的commit上.
以protobuf为例, 首先使用下面的命令来查找相符的commit:
git log --color=always --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad)' --date=short | grep --color=never protobuf
可以看到类似的信息: b1fea4588 - [protobuf] update to 3.5.1 (2018-01-31)
checkout: git checkout b1fea4588
运行 vcpkg install protobuf
注: 未来官方可能会出官方解决方案来解决这个问题
2. vcpkg目录下的downloads子目录是安装包时的缓存目录,如果使用命令行安装包时,有某些包下载不下来导致报错,可以手动下载后,放到这个目录下面,就可以继续安装了。
3. visual studio IDE需要安装英文语言包才能支持vcpkg下载的包,安装方法是使用vs安装文件,然后在功能里选择语言,找到english,选择安装即可。
4. vcpkg安装了依赖库后,其相关文件会存入在installed文件夹下,编译平台不一样,目录就不一样,windows系统下x86平台会放在x86-windows目录内,x64平台会放到x64-windows目录内,在编译项目时,如果发现安装了对应的库,结果提示找不到库文件,可以先检查一下编译平台是x86还是x64,vcpkg默认安装32位的库,为了让它安装64位的库,添加系统环境变量:VCPKG_DEFAULT_TRIPLET=x64-windows(这个怎么设置目前还没有试过,因为还没用到),也可以在安装时指定平台:vcpkg install libmysql:x64-windows。可以在bin中找到dll文件,lib文件夹下找到lib文件,Debug中可以找到对应的debug版本文件,tools中可以找到依赖库的相关工具,比如protoc.exe就放在installed/x86-windows/tools/protobuf目录下。
5. vcpkg安装了protobuf后,编译时会报找不到libprotobuf.lib文件,这个可以在项目中添加预编译命令PROTOBUF_USE_DLLS来解决,添加了这个命令后,编译时将不再使用libprotobuf.lib文件,而是改用动态链接方式,在运行中使用对应的dll文件。应当使用这种动态链接的方式,采用这种方式后,对应编译方式的dll文件会自动拷贝到目标文件夹下,比如debug模式下,就会把libprotobufd.dll放到生成目录下,不需要再手动拷贝了。
6. 截止到2021-8-5日,一些库vcpkg不能完全支持
libmysql
不支持x86,仅支持x64
安装x64版本时, 也会报错, 需要手动安装依赖, 在centos环境下, 需要执行下列命令:
yum install python3
yum install autoconf
yum install automake
yum install autoconf-archive
linux环境下, 如果使用源码安装这个库, 可能会碰到错误: CMake Error: Curses library not found. Please install appropriate package, 解决方法:
源码安装MySQL或者mariadb的时候,在cmake的时候会遇到各种报错。
遇到 Curses library not found. Please install appropriate package 是其中一种报错
原因:是因为没有安装依赖,使用yum安装一下即可。(要根据提示的依赖名,在安装的时候后面增加-devel)
yum -y install ncurses-devel
如果还遇到其他报错,只需要根据报错的提示来安装对应的依赖,比如上面的报错提示是让你安装curses,所以需要装ncurses-devel这个环境依赖,然后再次cmake就行了
镜像
使用vcpkg安装包时,经常会出现下载失败的问题, 可以采用镜像下载, 镜像地址为
http://106.15.181.5
以下为使用方法:
设置环境变量:
X_VCPKG_ASSET_SOURCES
值为:
x-azurl,http://106.15.181.5/
并确保你的vcpkg为最新的(重新执行bootstrap脚本)即可。
若clone vcpkg的速度过慢,可使用gitee的fork:
JackBoosY/vcpkggitee.com
若在Windows中下载vcpkg.exe(通过bootstrap脚本)过慢,可使用以下链接手动下载:
https://gitee.com/jackboosy/vcpkg-tool/attach_files/746777/download/vcpkg.exegitee.com
并放到vcpkg根目录中。对于此exe的安全性请各位放心,该exe包含微软证书。
此mirror上的缓存包不完整,可能有一些包没有上传,烦请在gitee上提issue申请:
Issues · JackBoosY/vcpkg - Gitee.comgitee.com
若有其他问题,亦可在gitee上提issue。
再次推广下国内官博:
vcpkg - 博客园
解决GitHub网页githubusercontent地址无法访问问题
在下载包时,有时会遇到无法连接到raw.githubusercontent.com的问题,可以参考下面的方法.
GitHub里面图片都在githubusercontent.com域名上,我们只需要在hosts里面加上相关地址即可。如果你有代理,把域名加入到许可名单也可以的。
这里我们介绍hosts方式是如何使用的,把以下内容添加到hosts文件中。
1. hosts内容
# 2020年12月30日更新
# GitHub Start
52.74.223.119 github.com
52.74.223.119 gist.github.com
54.169.195.247 api.github.com
185.199.111.153 assets-cdn.github.com
199.232.96.133 raw.githubusercontent.com
199.232.96.133 gist.githubusercontent.com
199.232.96.133 cloud.githubusercontent.com
199.232.96.133 camo.githubusercontent.com
199.232.96.133 avatars0.githubusercontent.com
199.232.96.133 avatars1.githubusercontent.com
199.232.96.133 avatars2.githubusercontent.com
199.232.96.133 avatars3.githubusercontent.com
199.232.96.133 avatars4.githubusercontent.com
199.232.96.133 avatars5.githubusercontent.com
199.232.96.133 avatars6.githubusercontent.com
199.232.96.133 avatars7.githubusercontent.com
199.232.96.133 avatars8.githubusercontent.com
199.232.96.133 user-images.githubusercontent.com
185.199.109.154 github.githubassets.com
# GitHub End
注意 : 这里域名对应的ip是通过dns查询工具查询得到的,你应当选择的是延时相对较小且比较稳定的ip。
如果发现不起作用,或者速度不理想,参考"查找域名IP"。
2. 如何修改
2.1 Windows
hosts文件位置:C:/windows/system32/drivers/etc/hosts。
将前文内容追加到hosts,然后刷新DNS缓存:
ipconfig /flushdns
2.2 Mac
hosts文件位置:/etc/hosts。
Mac系统下修改需要按照如下方式:
1:首先,打开(访达)Finder。
2:使用组合键Shift+Command+G打开"前往文件夹",在输入框输入/etc/hosts。
3:然后就会跳转到hosts文件位置。
复制hosts文件到桌面上,鼠标右键点击/右击它,选择「打开方式」—「文本编辑」,打开这个hosts文件,然后将你要修改的内容直接在里面修改就好了。
然后把你修改好的hosts文件在复制回hosts文件的所在(文件夹下)路径:/etc/hosts 之下替换原始的hosts文件就好了。
注意:如果弹出密码输入框,你需要输入你当前电脑登录账号的密码。
最后刷新下缓存:
sudo killall -HUP mDNSResponder
3. 查找域名IP
- DNS查询-站长工具
- IP或域名查询-查询网
- IPAddress.com
注:2020年12月30日我实际使用 IPAddress 才可以生效,前面两个查询站点获取的 IP 均无法使用,各位可以都尝试下直到生效。
前面hosts里面域名里分为两类:
- .http://githubusercontent.com
- .http://github.com
*.githubusercontent.com可以使用同一个IP,不需要每个单独查询。*.github.com未经测试,目前看是需要单独查询对应的IP。