记一次Vcpkg安装库失败
缘起
在OAuth2.0和C++ REST SDK使用示例中遇到了无法获取令牌的问题,最终发现示例用的是最新的C++ REST SDK,而本地安装的不是最新的,耗费了很多时间最终把示例跑通了;
于是之后就更新Vcpkg,但是C++ REST SDK
安装不上了!
Vcpkg的变化
在最新的版本上,增加了库构建依赖,譬如C++ REST SDK
的CONTROL
:
Source: cpprestsdk
Version: 2.9.0-1
Build-Depends: zlib [windows], openssl [windows], boost [windows]
Description: C++11 JSON, REST, and OAuth library
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
新增了Build-Depends
;也就是说,如果尝试安装cpprestsdk,会先安装其依赖:zlib、openssl、boost。
下载boost太艰难
因为网络的原因,在zlib安装完成之后,就卡到了boost下载这一步......
最后无奈手动下载了boost源码包放在vcpkg/downloads
下才将boost安装成功。
openssl构建失败
构建openssl时失败了,打开vcpkg/buildtrees/openssl
下的构建日志,发现在使用源代码下的util/copy.pl
复制文件时失败了......
虽然以前写过perl脚本,但是许久不用,有些生疏,用了print
大法之后,发现在执行复制时,传递的文件列表被包裹上了"
号,本来是复制ms/applink.c
,由于附加了"
,变成了复制"ms/applink.c"
,于是就找不到对应文件引发报错。
我电脑上使用了Cmder,内置了perl解释器,于是怀疑是它的原因,但是下载perl耗时太久,无奈就想办法调整copy.pl
。
在copy.pl
脚本第22行附加,看到了这样一些信息:
$arg =~ s|\\|/|g; # compensate for bug/feature in cygwin glob...
foreach (glob "\"$arg\"")
由于构建日志中显示copy_if_different.pl
执行是没有问题的,对比发现是如下的问题:
foreach (glob "\"$arg\"") # copy.pl
foreach (glob $arg) # copy_if_different.pl
{
push @filelist, $_;
}
对perl了解过的都知道,$_
获取的是上一次的结果,copy.pl
的写法里用"
包裹了字符串,从而导致了之前的问题。
openssl的解决方法
将调整好的copy.pl
替换掉原先的copy.pl
后即可,如何替换?
- 将
copy.pl
置于vcpkg/ports/openssl
中 - 在
portfile.cmake
中将copy.pl
复制到源代码路径
file(COPY
${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt
${CMAKE_CURRENT_LIST_DIR}/PerlScriptSpaceInPathFixes.patch
${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch
${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch
${CMAKE_CURRENT_LIST_DIR}/copy.pl
DESTINATION ${SOURCE_PATH})
- 修改
vcpkg\ports\openssl
中的CMakeLists.txt
,复制copy.pl
到正确的位置
由于构建流程的限制,在上一步骤中无法将copy.pl
复制到正确的位置,需要再做一步。
vcpkg_apply_patches(
SOURCE_PATH ${SOURCE_PATH}
PATCHES ${CMAKE_CURRENT_LIST_DIR}/PerlScriptSpaceInPathFixes.patch
${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch
${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch
)
file(COPY
${CMAKE_CURRENT_LIST_DIR}/copy.pl
DESTINATION ${SOURCE_PATH}/util)
总结
构建的流程万变不离其宗,通过了解Vcpkg的实现,了解常规的构造流程,碰到问题时多分析多思考,就可以解决问题。