美文网首页
记一次Vcpkg安装库失败

记一次Vcpkg安装库失败

作者: 长不胖的Garfield | 来源:发表于2016-12-28 10:58 被阅读0次

缘起

OAuth2.0和C++ REST SDK使用示例中遇到了无法获取令牌的问题,最终发现示例用的是最新的C++ REST SDK,而本地安装的不是最新的,耗费了很多时间最终把示例跑通了;
于是之后就更新Vcpkg,但是C++ REST SDK安装不上了!

Vcpkg的变化

在最新的版本上,增加了库构建依赖,譬如C++ REST SDKCONTROL:

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后即可,如何替换?

  1. copy.pl置于vcpkg/ports/openssl
  2. 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})
  1. 修改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的实现,了解常规的构造流程,碰到问题时多分析多思考,就可以解决问题。

相关文章

网友评论

      本文标题:记一次Vcpkg安装库失败

      本文链接:https://www.haomeiwen.com/subject/wnhyvttx.html