vcpkg快速入门手册
文章目錄
- 1. 簡介
- 2. 安裝與使用
- 2.1 獲取vcpkg
- 2.2 編譯vcpkg
- 2.3 vcpkg的文件夾層次結構
- 2.4 設置vcpkg的環境變量
- 2.5 vcpkg的常用命令
- 2.6 安裝包與Visual Studio集成
- 3. 常見的C++庫的CMake配置方式
- 3.1 Boost
- 3.2 cereal
- 3.3 Ceres Solver
- 3.4 CGAL
- 3.5 FLANN
- 3.6 GDAL
- 3.7 GLEW
- 3.8 GMP
- 3.9 GTest
- 3.10 GSL
- 3.11 HDF5
- 3.12 Lastools/Laslib
- 3.13 OpenCV
- 3.14 OpenNI2
- 3.15 OSG
- 3.16 PDAL
- 3.17 PROJ
- 3.18 Pybind11庫
- 3.19 Range-v3
- 3.20 SltBench
- 3.21 VTK
- 4. vcpkg常見的錯誤解決
- 4.1 未安裝VS英文語言包
- 4.2 未關閉防病毒軟件
- 4.3 未正確下載軟件源
- 4.4 常見C++庫編譯錯誤的解決辦法
如果你希望了解vcpkg,希望解決包括如何使用vcpkg構建軟件包,如何將vcpkg構建的軟件包集成到Visual Studio,如何使用vcpkg構建指定版本的軟件包,如何解決vcpkg的常見報錯信息,如何與CMake配合構建工程等等問題,請你認真閱讀本文檔以快速入門!
1. 簡介
vcpkg 是適用于 C 和 C++ 庫的跨平臺命令行包管理器。 它簡化了 Windows、Linux 和 macOS 上第三方庫的購置與安裝。 如果項目要使用第三方庫,建議通過 vcpkg 來安裝它們。 vcpkg 同時支持開源和專有庫。 已測試 vcpkg Windows 目錄中所有庫與 Visual Studio 2015、Visual Studio 2017 及 Visual Studio 2019 的兼容性。 在 Windows 和 Linux/macOS 目錄之間,vcpkg 現已支持數千個庫。 C++ 社區會不斷向兩個目錄添加更多的庫。
微軟官方介紹鏈接
2. 安裝與使用
2.1 獲取vcpkg
vcpkg的官方源碼站點為:https://github.com/microsoft/vcpkg
可以使用git命令獲取官方代碼倉庫
git clone https://github.com/microsoft/vcpkg2.2 編譯vcpkg
-
Windows平臺
在控制臺中切換到vcpkg所在目錄,運行vcpkg目錄下的bootstrap-vcpkg.bat命令,編譯好后會在vcpkg所在目錄下生產vcpkg.exe文件。
C:\Users\Administrator>F:F:\>cd vcpkg/vcpkgF:\vcpkg\vcpkg>bootstrap-vcpkg.bat注意:最新版官方去掉了本地編譯的過程,會從官方倉庫中下載已經生成好的vcpkg.exe文件
-
Linux平臺
在終端中執行vcpkg目錄下的sudo bash ./ bootstrap-vcpkg.sh命令,會生成一個可執行文件vcpkg。定義環境變量VCPKG_ROOT="/vcpkg"
2.3 vcpkg的文件夾層次結構
所有 vcpkg 功能和數據都自包含在實例的單獨目錄層次結構中。 沒有注冊表設置或環境變量。 可以在一臺計算機上設置任意數量的 vcpkg 實例,它們彼此互不干擾。vcpkg 的文件夾層次結構如下:
- buildtrees - 包含從中生成每個庫的源的子文件夾。
- docs - 文檔和示例。
- downloads - 所有已下載的工具或源的緩存副本。 運行安裝命令時,vcpkg 會首先搜索此處。
- installed - 包含每個已安裝庫的標頭和二進制文件。 與 Visual Studio 集成時,實質上是相當于告知它將此文件夾添加到其搜索路徑。
- packages - 在不同的安裝之間用于暫存的內部文件夾。
- ports - 用于描述每個庫的目錄、版本和下載位置的文件。 如有需要,可添加自己的端口。
- scripts - 由 vcpkg 使用的腳本(CMake、PowerShell)。
- toolsrc - vcpkg 和相關組件的 C++ 源代碼。
- triplets - 包含每個受支持目標平臺(如 x86-windows 或 x64-uwp)的設置。
2.4 設置vcpkg的環境變量
為了方便vcpkg的使用,建議在環境變量中設置如下值:
| VCPKG_DEFAULT_TRIPLET | x64-windows | vcpkg默認構建的三元組,通常在Windows 64位平臺下可以直接設置為x64-windows |
| VCPKG_ROOT | F:\vcpkg\vcpkg | vcpkg的工作目錄,對于本地存在多個版本的vcpkg,不建議設置此變量 |
| VCPKG_DOWNLOADS | F:\vcpkg\downloads | vcpkg下載軟件源和工具的緩存目錄,建議保留此文件夾中的所有文件。 |
2.5 vcpkg的常用命令
-
help命令
可以查看vcpkg的常用命令
vcpkg help -
install命令
安裝一個指定的軟件包,該C++軟件包必須被vcpkg支持,即在ports文件夾內能找到該軟件包的端口描述。
vcpkg install gdal需要注意的是,通常一個軟件包可以附帶多種其他三方庫的功能支持,部分功能已經被vcpkg支持(可以通過searchsearchsearch命令查看軟件包附帶的第三方支持),通過vcpkg安裝軟件包時也可以同時制定三方庫特性的支持。例如安裝一個Windows系統64位版本的帶libspatialite支持的gdal庫可以使用如下命令:
vcpkg install gdal[core,libspatialite] --triplet=x64-windowsvcpkg在編譯軟件包時,會將從軟件包官方源中下載到的tar格式源碼解壓到buildtrees文件夾,并且編譯的中間文件也會在buildtrees文件夾。默認情況下,buildtrees文件夾在vcpkg的根目錄下,也可以在安裝軟件包時指定buildtrees文件夾的實際位置,例如:
vcpkg install gdal[core,libspatialite] --triplet=x64-windows --x-buildtrees-root=F:/vcpkg/buildtrees -
remove命令
移除一個指定的安裝包,例如刪除已經安裝好的gdal包使用如下命令:
vcpkg remove gdal如果希望移除所有outdated的安裝包,可以使用以下命令:
vcpkg remove --outdated有些時候,僅僅通過remove命令刪除已經安裝好的軟件包會出現異常。例如可能出現刪除安裝包后,重新安裝包提示“已經安裝”。如果我們需要徹底將包從installed目錄中移除,需要執行以下流程:
-
從packages目錄中找到包對應的目錄(注意區分版本),將整個目錄全部刪除;
-
從buildtrees 目錄中找到包對應的目錄,將整個目錄全部刪除;
-
進入installed\vcpkg\info目錄,查找包對應的listlistlist文件。listlistlist文件中記錄了包生成后的lib、dll、pdb、include頭文件和其他輔助文件,手動刪除這些文件,最后刪除listlistlist文件本身;
-
進入installed\vcpkg目錄,打開statusstatusstatus文件,搜索包,將包相關內容手動刪除。
-
-
list命令
列表所有已經安裝的軟件包,也可以指定名以列出按照的某一具體軟件包
vcpkg list # list all installed packagesvcpkg list gdal # list installed gdal通過listlistlist命令可以方便地查詢某個安裝包是否安裝以及對應的安裝版本:
-
search命令
搜索vcpkg支持的安裝包:
vcpkg search gdal當需要查看安裝包附帶哪些三方庫支持時,使用searchsearchsearch命令也很方便:
-
depend-info命令
搜索安裝包的依賴,如果安裝時指定了第三方庫的支持,搜索依賴時也需要指定軟件包具有哪些三方庫特性。例如,搜索一個帶Qt、Cuda支持的OpenCV庫依賴哪些包,可以使用以下命令:
vcpkg depend-info opencv[qt,cuda]
**如果希望知道哪些軟件包依賴包,目前vcpkg沒有命令直接支持這一功能。**可以打開statusstatusstatus文件,進行檢索判斷。例如如果想知道哪些包依賴hdf5庫,在statusstatusstatus文件中搜索hdf5,所有depends一欄有hdf5列出的包都依賴hdf5庫,例如OpenCV:
-
x-history命令
查詢vcpkg中軟件包的更新記錄,需要注意的是,vcpkg引入一個包的端口更新時需要兼容所有依賴它的其他端口,以保證兼容性。因此,vcpkg支持的軟件包的更新記錄和的官方更新記錄并不一定同步。
當需要安裝一個特定版本的包(非vcpkg查詢到的最新版),可以使用x-history命令獲取的更新記錄,并借助git reset命令獲取對應記錄的端口信息,此時可以構建一個特定版本的包。
以Boost庫為例,使用x-history命令查詢可知,目前vcpkg支持構建的Boost庫最新版為1.75.0版:
vcpkg x-history boost如果我們希望構建Boost 1.74.0 版本,通過查詢可知,1.74.0版的提交記錄為:7944ed328a10833c4a6b3ab3ff94,使用git回退到指定版本(工作區也回退到對應commit的狀態),然后重新構建。整個過程的命令如下:
vcpkg x-history boost # get boost_1.74.0 commit id: 7944ed328a10833c4a6git reset --hard 7944ed328a10833c4a6vcpkg install boost需要注意的是,git reset --hard 7944ed328a10833c4a6命令會將vcpkg支持的所有安裝包對應的端口描述回退到commit 7944ed328a10833c4a6的狀態。而通常情況下,我們并不希望其他已經安裝的軟件包受到回退的影響,我們可以采用不同目錄下的vcpkg解決這個問題!由于vcpkg并不會將信息記錄到當前工作目錄以外的區域(如注冊表),我們可以將vcpkg拷貝到不同文件夾實現不同版本的區分。例如我采用F:/vcpkg/vcpkg作為與官方同步的vcpkg版,保持與Microsoft Vcpkg小組的同步更新,同時采用F:/vcpkg/vcpkg-bak作為本地需要構建特殊版本安裝包的備用版。因此,我會在F:/vcpkg/vcpkg-bak目錄下運行git reset --hard 7944ed328a10833c4a6命令。
當構建完成Boost 1.74.0 版,如果希望vcpkg的端口描述文件恢復到官方最新的維護狀態,可以使用git pull命令。運行此命令不會改變本地以及構建好的編譯結果!
-
export命令
導出指定安裝包,可以指定安裝包的導出方式(如raw、nuget、zip、7zip等等),例如以zip壓縮包導出gdal安裝包可以運行以下命令:
vcpkg export gdal --zip運行完成后,會在vcpkg目錄下以運行時間生成一個zip壓縮包。zip包內的目錄結構如下:
- installed - 包含導出安裝包的頭文件和二進制文件(lib、pdb、dll等)。
- scripts - 由 vcpkg 使用的腳本(CMake、PowerShell)
在下一節會介紹如何使用vcpkg生成的腳本文件配合CMake完成工程的構建。
當我們擁有多個版本的vcpkg,同時希望將不同版本vcpkg編譯的二進制軟件包合并在一個installed目錄,我們也可以將制定的安裝包通過命令export導出,然后將導出包中installed目錄下的構建平臺文件夾與目的installed目錄下的平臺文件夾直接合并(例如x64-windows文件夾)。installed\vcpkg\info目錄也可以直接合并,而對于installed\vcpkg目錄下的statusstatusstatus文件,需要手動進行合并。
-
update命令
可以查詢已經安裝的軟件包中哪些包可以更新,將查詢信息輸出至upinfo.txt文件的命令如下:
vcpkg update > upinfo.txtupinfo.txt文件中記錄的查詢結果如下:
Using local portfile versions. To update the local portfiles, use git pull.
The following packages differ from their port versions:
boost:x64-windows 1.74.0 -> 1.75.0
boost-accumulators:x64-windows 1.74.0 -> 1.75.0
boost-algorithm:x64-windows 1.74.0 -> 1.75.0
boost-align:x64-windows 1.74.0 -> 1.75.0
boost-any:x64-windows 1.74.0 -> 1.75.0
boost-array:x64-windows 1.74.0 -> 1.75.0
boost-asio:x64-windows 1.74.0 -> 1.75.0#1
boost-assert:x64-windows 1.74.0 -> 1.75.0
boost-assign:x64-windows 1.74.0 -> 1.75.0
boost-atomic:x64-windows 1.74.0 -> 1.75.0
boost-beast:x64-windows 1.74.0 -> 1.75.0
boost-bimap:x64-windows 1.74.0 -> 1.75.0
boost-bind:x64-windows 1.74.0 -> 1.75.0
boost-build:x64-windows 1.74.0 -> 1.75.0.beta1#1
boost-callable-traits:x64-windows 1.74.0 -> 1.75.0
boost-chrono:x64-windows 1.74.0 -> 1.75.0
boost-circular-buffer:x64-windows 1.74.0 -> 1.75.0
boost-compatibility:x64-windows 1.74.0 -> 1.75.0
boost-compute:x64-windows 1.74.0 -> 1.75.0
boost-concept-check:x64-windows 1.74.0 -> 1.75.0
boost-config:x64-windows 1.74.0 -> 1.75.0
boost-container:x64-windows 1.74.0 -> 1.75.0
boost-container-hash:x64-windows 1.74.0 -> 1.75.0
boost-context:x64-windows 1.74.0 -> 1.75.0
boost-contract:x64-windows 1.74.0 -> 1.75.0
boost-conversion:x64-windows 1.74.0 -> 1.75.0
boost-convert:x64-windows 1.74.0 -> 1.75.0
boost-core:x64-windows 1.74.0 -> 1.75.0
boost-coroutine:x64-windows 1.74.0 -> 1.75.0
boost-coroutine2:x64-windows 1.74.0 -> 1.75.0
boost-crc:x64-windows 1.74.0 -> 1.75.0
boost-date-time:x64-windows 1.74.0 -> 1.75.0
boost-detail:x64-windows 1.74.0 -> 1.75.0
boost-dll:x64-windows 1.74.0 -> 1.75.0
boost-dynamic-bitset:x64-windows 1.74.0 -> 1.75.0
boost-endian:x64-windows 1.74.0 -> 1.75.0
boost-exception:x64-windows 1.74.0 -> 1.75.0
boost-fiber:x64-windows 1.74.0 -> 1.75.0
boost-filesystem:x64-windows 1.74.0 -> 1.75.0
boost-flyweight:x64-windows 1.74.0 -> 1.75.0
boost-foreach:x64-windows 1.74.0 -> 1.75.0
boost-format:x64-windows 1.74.0 -> 1.75.0
boost-function:x64-windows 1.74.0 -> 1.75.0
boost-function-types:x64-windows 1.74.0 -> 1.75.0
boost-functional:x64-windows 1.74.0 -> 1.75.0
boost-fusion:x64-windows 1.74.0 -> 1.75.0
boost-geometry:x64-windows 1.74.0 -> 1.75.0
boost-gil:x64-windows 1.74.0 -> 1.75.0
boost-graph:x64-windows 1.74.0 -> 1.75.0
boost-graph-parallel:x64-windows 1.74.0 -> 1.75.0
boost-hana:x64-windows 1.74.0 -> 1.75.0
boost-heap:x64-windows 1.74.0 -> 1.75.0
boost-histogram:x64-windows 1.74.0 -> 1.75.0
boost-hof:x64-windows 1.74.0 -> 1.75.0
boost-icl:x64-windows 1.74.0 -> 1.75.0
boost-integer:x64-windows 1.74.0 -> 1.75.0
boost-interprocess:x64-windows 1.74.0 -> 1.75.0
boost-interval:x64-windows 1.74.0 -> 1.75.0
boost-intrusive:x64-windows 1.74.0 -> 1.75.0
boost-io:x64-windows 1.74.0 -> 1.75.0
boost-iostreams:x64-windows 1.74.0 -> 1.75.0
boost-iterator:x64-windows 1.74.0 -> 1.75.0
boost-lambda:x64-windows 1.74.0 -> 1.75.0
boost-lexical-cast:x64-windows 1.74.0 -> 1.75.0
boost-local-function:x64-windows 1.74.0 -> 1.75.0
boost-locale:x64-windows 1.74.0#3 -> 1.75.0
boost-lockfree:x64-windows 1.74.0 -> 1.75.0
boost-log:x64-windows 1.74.0 -> 1.75.0
boost-logic:x64-windows 1.74.0 -> 1.75.0
boost-math:x64-windows 1.74.0 -> 1.75.0
boost-metaparse:x64-windows 1.74.0 -> 1.75.0
boost-modular-build-helper:x64-windows 1.74.0#2 -> 1.75.0#4
boost-move:x64-windows 1.74.0 -> 1.75.0
boost-mp11:x64-windows 1.74.0 -> 1.75.0
boost-mpi:x64-windows 1.74.0 -> 1.75.0
boost-mpl:x64-windows 1.74.0 -> 1.75.0
boost-msm:x64-windows 1.74.0 -> 1.75.0
boost-multi-array:x64-windows 1.74.0 -> 1.75.0
boost-multi-index:x64-windows 1.74.0 -> 1.75.0
boost-multiprecision:x64-windows 1.74.0 -> 1.75.0
boost-nowide:x64-windows 1.74.0 -> 1.75.0
boost-numeric-conversion:x64-windows 1.74.0 -> 1.75.0
boost-odeint:x64-windows 1.74.0 -> 1.75.0
boost-optional:x64-windows 1.74.0 -> 1.75.0
boost-outcome:x64-windows 1.74.0 -> 1.75.0
boost-parameter:x64-windows 1.74.0 -> 1.75.0
boost-parameter-python:x64-windows 1.74.0 -> 1.75.0
boost-phoenix:x64-windows 1.74.0 -> 1.75.0
boost-poly-collection:x64-windows 1.74.0 -> 1.75.0
boost-polygon:x64-windows 1.74.0 -> 1.75.0
boost-pool:x64-windows 1.74.0 -> 1.75.0
boost-predef:x64-windows 1.74.0 -> 1.75.0
boost-preprocessor:x64-windows 1.74.0 -> 1.75.0
boost-process:x64-windows 1.74.0 -> 1.75.0
boost-program-options:x64-windows 1.74.0 -> 1.75.0
boost-property-map:x64-windows 1.74.0 -> 1.75.0
boost-property-tree:x64-windows 1.74.0 -> 1.75.0
boost-proto:x64-windows 1.74.0 -> 1.75.0
boost-ptr-container:x64-windows 1.74.0 -> 1.75.0
boost-python:x64-windows 1.74.0 -> 1.75.0#1
boost-qvm:x64-windows 1.74.0 -> 1.75.0
boost-random:x64-windows 1.74.0 -> 1.75.0
boost-range:x64-windows 1.74.0 -> 1.75.0
boost-ratio:x64-windows 1.74.0 -> 1.75.0
boost-rational:x64-windows 1.74.0 -> 1.75.0
boost-regex:x64-windows 1.74.0 -> 1.75.0
boost-safe-numerics:x64-windows 1.74.0 -> 1.75.0
boost-scope-exit:x64-windows 1.74.0 -> 1.75.0
boost-serialization:x64-windows 1.74.0 -> 1.75.0
boost-signals2:x64-windows 1.74.0 -> 1.75.0
boost-smart-ptr:x64-windows 1.74.0 -> 1.75.0
boost-sort:x64-windows 1.74.0 -> 1.75.0
boost-spirit:x64-windows 1.74.0 -> 1.75.0
boost-stacktrace:x64-windows 1.74.0 -> 1.75.0
boost-statechart:x64-windows 1.74.0 -> 1.75.0
boost-static-assert:x64-windows 1.74.0 -> 1.75.0
boost-static-string:x64-windows 1.74.0 -> 1.75.0
boost-stl-interfaces:x64-windows 1.74.0 -> 1.75.0
boost-system:x64-windows 1.74.0 -> 1.75.0
boost-test:x64-windows 1.74.0 -> 1.75.0
boost-thread:x64-windows 1.74.0 -> 1.75.0
boost-throw-exception:x64-windows 1.74.0 -> 1.75.0
boost-timer:x64-windows 1.74.0 -> 1.75.0
boost-tokenizer:x64-windows 1.74.0 -> 1.75.0
boost-tti:x64-windows 1.74.0 -> 1.75.0
boost-tuple:x64-windows 1.74.0 -> 1.75.0
boost-type-erasure:x64-windows 1.74.0 -> 1.75.0
boost-type-index:x64-windows 1.74.0 -> 1.75.0
boost-type-traits:x64-windows 1.74.0 -> 1.75.0
boost-typeof:x64-windows 1.74.0 -> 1.75.0
boost-ublas:x64-windows 1.74.0 -> 1.75.0
boost-uninstall:x64-windows 1.74.0 -> 1.75.0
boost-units:x64-windows 1.74.0 -> 1.75.0
boost-unordered:x64-windows 1.74.0 -> 1.75.0
boost-utility:x64-windows 1.74.0 -> 1.75.0
boost-uuid:x64-windows 1.74.0 -> 1.75.0
boost-variant:x64-windows 1.74.0 -> 1.75.0
boost-variant2:x64-windows 1.74.0 -> 1.75.0
boost-vmd:x64-windows 1.74.0 -> 1.75.0
boost-wave:x64-windows 1.74.0 -> 1.75.0
boost-winapi:x64-windows 1.74.0 -> 1.75.0
boost-xpressive:x64-windows 1.74.0 -> 1.75.0
boost-yap:x64-windows 1.74.0 -> 1.75.0
pcl:x64-windows 1.11.1#1 -> 1.11.1#2To update these packages and all dependencies, run
.\vcpkg upgradeTo only remove outdated packages, run
.\vcpkg remove --outdated說明本地安裝的軟件包中Boost庫可以升級到1.75.0版,pcl庫可以升級到1.11.1#2版,其他已經安裝的軟件包均為vcpkg支持的最新版。
-
upgrade命令
vcpkg upgrade --no-dry-run
如果希望直接重建所有可升級的安裝包,可以用以下方式運行命令: -
integrate命令
將vcpkg構建的安裝包與Vistual Stuido集成:當需要設置為所有項目均可使用vcpkg構建的安裝包時,可以使用vcpkg integrate install命令;當需要解除與Visual Studio的集成時,可以使用vcpkg integrate remove命令;當需要與某一具體工程集成時,可以使用vcpkg integrate project命令生成一個參考包配合nuget與單一工程集成。相關集成的方法將在下一小節具體介紹。
2.6 安裝包與Visual Studio集成
-
全局集成
vcpkg integrate install
vcpkg可以自動為VS工程適配目錄,開發者并不需要關心已安裝的庫的目錄在哪里,也不需要設置庫目錄和引用目錄就能自由地使用。使用以下命令可以完成全局集成:我們新建一個hello-world工程測試下全局集成的效果,建立好hello-world工程后,可以在工程屬性選項中看到vcpkg的選項卡:
可以在選項卡中進行vcpkg的相關設置,簡單為hello-world工程引入OpenCV庫,只需要包含好相應的頭文件就可以正常調用OpenCV的相關函數:
#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp>int main() {const std::string imgFile = "F:/TestData/Imagery/image_small.tif";auto imgMat = cv::imread(imgFile, cv::IMREAD_GRAYSCALE);cv::namedWindow("image_small", cv::WINDOW_NORMAL);cv::imshow("image_small", imgMat);cv::waitKey(0);return 0; }可以看到工程正常編譯沒有任何報錯信息,并且編譯后的執行程序可以正常運行:
進入二進制文件生成文件夾,可以看到vcpkg自動將hello-world.exe依賴的庫拷貝到生成目錄了!
如果希望去掉vcpkg的全局集成可以使用以下命令:
vcpkg integrate remove -
集成到單一工程
vcpkg integrate project
使用以下命令生成nuget配置文件:運行完成后會有如下提示:
F:\vcpkg\vcpkg>vcpkg integrate project
Created nupkg: F:\vcpkg\vcpkg\scripts\buildsystems\vcpkg.F.vcpkg.vcpkg.1.0.0.nupkgWith a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
Install-Package vcpkg.F.vcpkg.vcpkg -Source “F:\vcpkg\vcpkg\scripts\buildsystems”此時需要配合nuget包管理工具完成工程設置。在Viusal Studio中點擊工具→Nuget包管理器→程序包管理器設置,在打開的選項卡中完成如下設置:
設置完成后點擊工具→Nuget包管理器→管理解決方案的NuGet程序包,在打開的選項卡中完成如下設置:
安裝完成后,hello-world工程即可以正常編譯!
-
與CMake集成使用
除開以上方式直接與Visual Studio集成使用,vpckg還提供了腳本可以直接與CMake、Powershell等工具集成使用構建工程。這里簡單介紹下如何與CMake集成使用。
在CMake申明創建第一個project前,加上以下定義:
set(VCPKG_ROOT "F:/vcpkg/vcpkg") SET(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "") endif() set(VCPKG_3RD_PARTY_ROOT "${VCPKG_ROOT}/installed/${VCPKG_TARGET_TRIPLET}") set(VCPKG_3RD_PARTY_INCLUDE "${VCPKG_3RD_PARTY_ROOT}/include")即指明CMAKE_TOOLCHAIN_FILE的路徑和軟件包的編譯三元組(需要從環境變量中讀取相應的值),此時可以定義vcpkg編譯的三方庫應用目錄為VCPKG_3RD_PARTY_INCLUDE。
在為目標工程引入三方庫前,需要使用find_package{find\_package}find_package命令和include_directories{include\_directories}include_directories命令(或target_include_directories{target\_include\_directories}target_include_directories命令):
#找到OpenCV軟件包 find_package(OpenCV REQUIRED) #為所有子工程增加附加引用目錄 ${VCPKG_3RD_PARTY_INCLUDE} include_directories(${VCPKG_3RD_PARTY_INCLUDE})add_executable(${proj_name} ${RCS}) #為工程${proj_name}鏈接OpenCV的libs target_link_libraries(${proj_name} PRIVATE ${OpenCV_LIBS}) #為工程${proj_name}增加附加引用目錄 ${VCPKG_3RD_PARTY_INCLUDE} target_include_directories(${proj_name} PRIVATE ${VIS_INCLUDES})需要注意的是,CMake對不同的三方軟件包提供的查找方式、設置引用目錄方式和鏈接庫方式沒有固定模板,我們將在下一章介紹常見的第三方軟件包的CMake配置方式。
3. 常見的C++庫的CMake配置方式
CMake對不同的三方軟件包提供的查找方式、設置引用目錄方式和鏈接庫方式沒有固定模板,這里我們介紹了部分常見第三方軟件包的CMake配置方式。由于時間原因,并不是所有的配置信息都完成了測試,設置僅做參考,可能會因為實際情況做變更與調整。
3.1 Boost
Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱。
官方網站:https://www.boost.org/
set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) #只申明需要的組件 find_package(Boost 1.74.0 REQUIRED COMPONENTS filesystem date_time iostreams program_options python39 locale) target_link_libraries(${proj_name} PRIVATE ${Boost_LIBRARIES})3.2 cereal
cereal是一個只包含頭文件的C++ 11序列化庫。cereal接受任意數據類型,并可逆地將它們轉換為不同的表示形式,如緊湊二進制編碼、XML或JSON。cereal被設計成快速、輕量級、易于擴展——它沒有外部依賴,可以很容易地與其他代碼綁定或獨立使用。
官方網站:https://uscilab.github.io/cereal/
find_package(cereal CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE cereal)3.3 Ceres Solver
Ceres Solver是一個開源c++庫,用于建模和解決大型、復雜的優化問題。它可用于求解非線性有界約束最小二乘問題和一般無約束優化問題。
官方網站:http://ceres-solver.org/index.html
find_package(Ceres CONFIG REQUIRED) target_link_libraries(${proj_name} PRIVATE ceres Ceres::ceres)3.4 CGAL
CGAL(The Computational Geometry Algorithms Library)以C++庫的形式提供了方便的訪問高效可靠的幾何算法。CGAL用于需要幾何計算的各個領域,如地理信息系統、計算機輔助設計、分子生物學、醫學成像、計算機圖形學和機器人技術。
CGAL庫提供了豐富的數據結構和算法,如三角剖分,Voronoi圖,布爾操作的多邊形和多面體,點集處理,安排曲線,曲面和體積網格生成,幾何處理,阿爾法形狀,凸殼算法,形狀重建,AABB和KD樹…
官方網站:https://www.cgal.org/
find_package(CGAL CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE CGAL::CGAL)3.5 FLANN
FLANN是一個用于在高維空間中執行快速近似最近鄰搜索的庫。它包含了一組我們發現最適合最近鄰搜索的算法,以及一個根據數據集自動選擇最佳算法和最優參數的系統。
官方網站:https://github.com/mariusmuja/flann
find_package(flann CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE flann::flann flann::flann_cpp)3.6 GDAL
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。OGR是GDAL項目的一個分支,功能與GDAL類似,只不過它提供對矢量數據的支持。
官方網站:https://gdal.org/
find_package(GDAL REQUIRED) target_include_directories(${proj_name} PRIVATE ${GDAL_INCLUDE_DIRS}) target_link_libraries(${proj_name} PRIVATE ${GDAL_LIBRARIES})3.7 GLEW
OpenGL Extension Wrangler Library (GLEW)是一個跨平臺的開源C/ C++擴展加載庫。GLEW提供了高效的運行時機制來確定目標平臺支持哪些OpenGL擴展。OpenGL的核心和擴展功能在一個頭文件中公開。GLEW已經在各種操作系統上進行了測試,包括Windows、Linux、Mac OS X、FreeBSD、Irix和Solaris。
官方網站:http://glew.sourceforge.net/
find_package(GLEW REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE GLEW::GLEW)3.8 GMP
GMP是一個用于任意精度算法的免費庫,可操作有符號整數、有理數和浮點數。除了運行GMP的機器中的可用內存所暗示的精度之外,對精度沒有實際限制。GMP具有豐富的功能集,各功能具有規范的接口。GMP的主要目標應用是密碼學應用與研究、互聯網安全應用、代數系統、計算代數研究等。
官方網站:https://gmplib.org/
find_package(GMP REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} gmp libgmp)3.9 GTest
GTest(googletest)是測試技術團隊根據谷歌的具體要求和限制開發的測試框架。googletest跨平臺地支持任意類型的C++開發相關測試,不僅僅是單元測試…
官方網站:https://github.com/google/googletest
find_package(GTest REQUIRED) target_link_libraries(${proj_name} PRIVATE GTest::gmock GTest::gtest GTest::gmock_main GTest::gtest_main) #也有以下方式鏈接庫${GTEST_LIBRARIES} #target_link_libraries(${proj_name} PRIVATE ${GTEST_LIBRARIES})3.10 GSL
GNU科學庫(GSL)是一個面向C和c++程序員的數字庫。它是GNU通用公共許可證下的自由軟件。該庫提供了廣泛的數學例程,如隨機數生成器,特殊函數和最小二乘擬合。總共有超過1000個函數和一個廣泛的測試套件。
官方網站:https://www.gnu.org/software/gsl/
find_package(GSL REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE GSL::gsl GSL::gslcblas)3.11 HDF5
HDF(High-performance data management and storage suite)是美國國家高級計算應用中心(National Center for Supercomputing Application,NCSA)為了滿足各種領域研究需求而研制的一種能高效存儲和分發科學數據的新型數據格式 。HDF5是為快速I/O處理和存儲而構建的。
官方網站:https://www.hdfgroup.org/solutions/hdf5/
find_package(hdf5 CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE hdf5::hdf5-shared hdf5::hdf5_hl-shared)3.12 Lastools/Laslib
LASlib(帶有LASzip)是一個用于讀寫激光雷達的C++編程API。
官方網站:https://github.com/LAStools/LAStools
#以下鏈接方式似乎有問題,無法正確鏈接 find_package(laslib CONFIG REQUIRED) target_link_libraries(${proj_name} PRIVATE LASlib) #手動link lib文件 set(LASLIB_INCLUDE_DIR "${VCPKG_3RD_PARTY_INCLUDE}/LASlib") set(LASLIB_LIBRARY debug "${VCPKG_3RD_PARTY_ROOT}/debug/lib/LASlib.lib"optimized "${VCPKG_3RD_PARTY_ROOT}/lib/LASlib.lib") target_link_libraries(${proj_name} PRIVATE ${LASLIB_LIBRARY})3.13 OpenCV
OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺和機器學習軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。 它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要傾向于實時視覺應用,并在可用時利用MMX和SSE指令, 如今也提供對于C#、Ch、Ruby,GO的支持。
官方網站:https://opencv.org/
find_package(OpenCV REQUIRED) target_link_libraries(${proj_name} PRIVATE ${OpenCV_LIBS})3.14 OpenNI2
OpenNI(開放自然交互)是一個多語言,跨平臺的框架,它定義了編寫應用程序,并利用其自然交互的API。OpenNI API由一組可用來編寫通用自然交互應用的接口組成。OpenNI的主要目的是要形成一個標準的API,來搭建視覺和音頻傳感器與視覺和音頻感知中間件通信的橋梁。
官方網站:https://structure.io/openni
# openni2庫的配置全部未測試 set(OPENNI2_FOUND TRUE) # auto set(OPENNI2_VERSION 1.0.0) set(OPENNI2_ROOT_DIR "C:/car_libs/OpenNI2")find_path(OPENNI2_INCLUDE_DIR NAMES OpenNI.h PATHS "${OPENNI2_ROOT_DIR}/Include") mark_as_advanced(OPENNI2_INCLUDE_DIR) # show entry in cmake-guifind_library(OPENNI2_LIBRARY NAMES OpenNI2.lib PATHS "${OPENNI2_ROOT_DIR}/Lib") mark_as_advanced(OPENNI2_LIBRARY) # show entry in cmake-guiset(OPENNI2_INCLUDE_DIRS ${OPENNI2_INCLUDE_DIR} ) set(OPENNI2_LIBRARIES ${OPENNI2_LIBRARY} )3.15 OSG
OpenSceneGraph是一個開源的高性能3D圖形工具包,用于可視化仿真、游戲、虛擬現實、科學可視化和建模等領域的應用程序開發人員。它完全用標準c++和OpenGL編寫,可以在所有Windows平臺上運行,包括OSX、GNU/Linux、IRIX、Solaris、HP-Ux、AIX和FreeBSD操作系統。OpenSceneGraph現已成為世界領先的場景圖技術,廣泛應用于可視化模擬、空間、科學、石油天然氣、游戲和虛擬現實行業。
官方網站:http://www.openscenegraph.org/
find_package(OpenSceneGraph 3.6.5 REQUIRED osgDB osgUtil) include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}) target_link_libraries(${proj_name} ${OPENSCENEGRAPH_LIBRARIES}3.16 PDAL
PDAL是一個用于轉換和操作點云數據的C++ BSD庫。它非常像處理光柵和矢量數據的GDAL庫。除了庫代碼之外,PDAL還提供了一套命令行應用程序,用戶可以方便地使用它們來處理、過濾、翻譯和查詢點云數據。
官方網站:https://pdal.io/
find_package(PDAL REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE pdalcpp pdal_util pdal_arbiter pdal_kazhdan)3.17 PROJ
PROJ是一個通用的坐標轉換軟件,它將地理空間坐標從一個坐標參考系統(CRS)轉換到另一個。這包括地圖投影和大地變換。PROJ包括命令行應用程序,可以方便地從文本文件或直接從用戶輸入轉換坐標。除了命令行實用程序之外,PROJ還公開了一個應用程序編程接口,簡稱API。該API允許開發人員在自己的軟件中使用PROJ的功能,而不必自己實現類似的功能。
官方網站:https://proj.org/
find_package(proj4 CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE PROJ::proj PROJ4::proj)3.18 Pybind11庫
Pybind11是一個輕量級的頭文件庫,它在Python中公開c++類型,反之亦然,主要用于創建現有c++代碼的Python綁定。它的目標和語法與優秀的Boost相似,主要是用來在已有的 C++代碼的基礎上做擴展,它的語法和目標非常像Boost.Python,但Boost.Python為了兼容現有的基本所有的C++編譯器而變得非常復雜和龐大,而因此付出的代價是很多晦澀的模板技巧以及很多不必要的對舊版編譯器的支持。Pybind11摒棄了這些支持,它只支持python2.7以上以及C++ 11以上的編譯器,使得它比Boost.Python更加簡潔高效。
官方網站:https://github.com/pybind/pybind11
find_package(pybind11 CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE mylib pybind11::lto pybind11::embed pybind11::module)3.19 Range-v3
C++14/17/20的Range庫,是C++20的Range庫的基礎。
官方網站:https://ericniebler.github.io/range-v3/
find_package(range-v3 CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE range-v3 range-v3-meta range-v3::meta range-v3-concepts)3.20 SltBench
C++ benchmark工具
官方網站:https://github.com/ivafanas/sltbench
find_package(sltbench CONFIG REQUIRED) #以下鏈接方式未作測試 target_link_libraries(${proj_name} PRIVATE sltbench)3.21 VTK
可視化工具包(VTK)是用于操作和顯示科學數據的開源軟件。它提供了最先進的3D渲染工具,一套用于3D交互的小部件,以及廣泛的2D繪圖功能。
官方網站:https://vtk.org/
# vcpkg給的例子,鏈接方式未作測試,不一定對 find_package(3.13 CONFIG REQUIRED) target_link_libraries(${proj_name} PRIVATE ZLIB::ZLIB)find_package(3.16 CONFIG REQUIRED) target_link_libraries(${proj_name} PRIVATE PostgreSQL::PostgreSQL)find_package(99 CONFIG REQUIRED) target_link_libraries(${proj_name} PRIVATE X11::SM X11::Xi X11::Xt X11::Xv)find_package(vtk CONFIG REQUIRED) target_link_libraries(${proj_name} PRIVATE LZ4::LZ4 OGG::OGG VTK::lz4 VTK::mpi)4. vcpkg常見的錯誤解決
vcpkg編譯第三方軟件包時可能出現各種錯誤導致編譯失敗,這里列舉了一些使用vcpkg安裝軟件包時可能發生的錯誤及解決辦法。
4.1 未安裝VS英文語言包
在Windows中文版操作系統下,Visual Studio可能默認安裝為中文版,并不帶英文語言包。如果Viusal Studio沒有應用英文語言包,很多三方庫很容易編譯失敗,因此首先需要給Visual Studio安裝英文語言包。
運行Visual Studio Installer,在對應版本的Viusal Studio選項卡右方點擊修改按鈕,在彈出的新對話框中點擊語言包選項卡,勾選英語語言包并安裝。
4.2 未關閉防病毒軟件
vcpkg在編譯某些軟件包時會調用Microsoft Windows軟件開發工具包中的Mt.exe生成簽名文件和目錄,這一行為通常會被一些防病毒軟件誤報為危險操作而被防病毒軟件禁用,最終導致一些軟件包的安裝失敗!因此,為了保證獲取正確的安裝結果,在運行vcpkg的全程內請暫時禁用所有的防病毒軟件!
4.3 未正確下載軟件源
vcpkg支持的軟件包提供的官方源通常托管在github上或者是官方鏡像服務器上,這些服務器國內訪問速度很慢,而且通過vcpkg下載源碼網絡很不穩定。因為vcpkg并不支持斷點續傳,同時在安裝軟件包過程中下載的任何源文件,vcpkg都會默認進行文件哈希碼檢驗,在網絡不穩定的情況下,很容易發生下載異常,到賬編譯失敗!
目前在沒有更好的解決辦法下,可以將控制臺界面中展現的vcpkg正在下載的文件超鏈接地址復制到其他下載器手動下載,需要注意的是,vcpkg通常會將超鏈接中的文件重新命名(文件名通常不會保持一致)。因此,在我們手動下載完軟件源后,還需要重命名文件。重命名后的文件名也可以在控制臺界面查看到,同時也可以在vcpkg下載某一軟件源時,在vcpkg的downloads\temp文件夾內找到重命名后的臨時文件,可以參考這個臨時文件將手動下載好的軟件源重命名,然后復制到vcpkg的downloads文件夾。
4.4 常見C++庫編譯錯誤的解決辦法
-
Boost
Boost庫通常會被很多優秀的開源C++庫依賴,因此建議使用vcpkg最先編譯Boost庫。截止到2021年2月8日,vcpkg最新支持的Boost庫為1.75.0版。1.75.0版Boost庫與CMake集成使用時,目前CMake會彈出警告;同時,目前測試最新版(1.11.1版)的pcl庫使用Boost 1.75.0版編譯會編譯失敗。因此,建議目前僅安裝Boost 1.74.0版。 -
Qt5
很多C++庫在安裝時也可以指定Qt的支持,因此建議也優先使用vcpkg安裝Qt庫。截止到2021年2月8日,vcpkg最新支持的Qt庫為5.15.2版,經測試,如果在安裝Qt5前,已經安裝了protobuf庫,qt-webengine會編譯失敗。因此,如果qt-webengine無法正常編譯,可以先嘗試刪除protobuf。目前,qt-wayland會編譯失敗,考慮到我們的項目不需要這一特性,在編譯Qt5時去掉了wayland的支持。 -
GMP
需要先安裝 yasm-tool:x86-windows -
PCL
暫不支持Boost 1.75.0版,用Boost 1.74.0版可以編譯通過 -
VTK
-
VTK8.x版本依賴PROJ6.X版本;
-
VTK指定libmysql支持時,若已經安裝libmariadb,則會因為libmysql和libmariadb庫不兼容導致安裝失敗,可去掉二者其一;
-
VTK庫必須指定mpi支持;
-
OpenCV4.5.1版指定VTK支持時,暫不支持VTK 9.0版。
-
-
OpenCV
-
需要關閉防病毒軟件;
-
OpenCV4.5.1版指定VTK支持時,暫不支持VTK 9.0版;
-
編譯xfeature2d時,可能因為幾個描述文件下載失敗而導致整體編譯失敗,可以參考前文手動下載描述文件,或者通過以下方式下載:
#!/bin/bash cd ./cache/xfeatures2d/ cd boostdesc curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_lbgm.i > 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_256.i > e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_128.i > 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_064.i > 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_hd.i > 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_bi.i > 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i > 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i cd ../vgg curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i > 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_64.i > 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_48.i > e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_80.i > 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
-
總結
以上是生活随笔為你收集整理的vcpkg快速入门手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 要看cpu的性能好坏主要看什么
- 下一篇: Unity3D:粒子特效(Particl