天天看點

vcpkg下載下傳mysql庫_記一次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的實作,了解正常的構造流程,碰到問題時多分析多思考,就可以解決問題。