Windows下开发C/C++程序,少不了编译开源的第三方库。好比用于网络链接的高性能库libcurl、用于压缩解压的zlib等等。使用这些库开发极大的方便了程序员,使得咱们没必要重复造轮子。可是使用这些库必需要处理如下问题。php
因为这些开源库绝大部分都来源于Linux系统,致使其工程文件、编译系统都使用gnu系列工具,使得将其移植到Windows的VC开发环境下一直是难点。尽管最近几年不少开源库都支持了跨平台的cmake,可是编译过程仍然复杂和多样化。css
常见的编译方式有:java
编译方式 | 特色 | 举例 |
---|---|---|
configure、make | 须要msys这样的unix环境才能够编译 | ffmpeg |
自定义编译工具 | 须要学习特定的编译命令和工具 | openssl、boost |
cmake | 相对简单轻松 | libcurl |
VC工程文件 | 这种最简单,直接拿来便可编译 |
当了解了这些还不够,咱们还须要考虑预先编译出哪一种类型的开源库程序。好比:Debug仍是Release、动态库仍是静态库、MD仍是MT、32位仍是64位。光是这三种组合就有16种可能性。若是像libcurl这种还要考虑是否引用其余开源库的功能,那么编译类型的组合会更多。管理起来很麻烦。android
因为多样的编译类型,工程目录也必须仔细设定才能保证本身的软件项目可以正常编译。c++
Vcpkg的官方源码站点为:git
通常地,你可使用git命令克隆一个当前版本下来,或者直接下载压缩包。github
git clone https://github.com/microsoft/vcpkg
注意:web
Vcpkg大量使用的psl脚本,因此官方强烈推荐使用PowerShell而不时CMD命令行来执行各类操做。尽管在使用的时候兼容CMD,可是在编译这一步,请使用PowerShell。shell
编译很简单,使用PowerShell执行Vcpkg工程目录下的“bootstrap-vcpkg.bat”命令,便可编译。编译好之后会在同级目录下生成vcpkg.exe文件。编译期间,脚本会自动下载vswhere组件。
执行命令
.\vcpkg.exe search
这里的“安装”实际上是指下载和编译。
好比咱们须要安装经常使用的jsoncpp库,那么执行命令
.\vcpkg.exe install jsoncpp
输出:
The following packages will be built and installed:
jsoncpp[core]:x86-windows
Starting package 1/1: jsoncpp:x86-windows
Building package jsoncpp[core]:x86-windows...
-- CURRENT_INSTALLED_DIR=H:/Repos/vcpkg/installed/x86-windows -- DOWNLOADS=H:/Repos/vcpkg/downloads -- CURRENT_PACKAGES_DIR=H:/Repos/vcpkg/packages/jsoncpp_x86-windows -- CURRENT_BUILDTREES_DIR=H:/Repos/vcpkg/buildtrees/jsoncpp -- CURRENT_PORT_DIR=H:/Repos/vcpkg/ports/jsoncpp/. -- Downloading https://github.com/open-source-parsers/jsoncpp/archive/1.8.1.tar.gz... -- Downloading https://github.com/open-source-parsers/jsoncpp/archive/1.8.1.tar.gz... OK -- Testing integrity of downloaded file... -- Testing integrity of downloaded file... OK -- Extracting source H:/Repos/vcpkg/downloads/open-source-parsers-jsoncpp-1.8.1.tar.gz -- Extracting done -- Configuring x86-windows-rel -- Configuring x86-windows-rel done -- Configuring x86-windows-dbg -- Configuring x86-windows-dbg done -- Build x86-windows-rel -- Build x86-windows-rel done -- Build x86-windows-dbg -- Build x86-windows-dbg done -- Performing post-build validation -- Performing post-build validation done Building package jsoncpp[core]:x86-windows... done
Installing package jsoncpp[core]:x86-windows...
Installing package jsoncpp[core]:x86-windows... done
Elapsed time for package jsoncpp:x86-windows: 47.81 s
Total elapsed time: 47.81 s
The package jsoncpp:x86-windows provides CMake targets:
find_package(jsoncpp REQUIRED)
target_link_libraries(main PRIVATE jsoncpp_lib)
咱们大体能够了解到install会经历这几个过程:
注意点:
若是电脑中没有安装cmake,vcpkg会自动下载portable版本的cmake。可是因为各类缘由,下载的网速很慢,因此建议先自行下载安装msi版本的cmake。最好是下载最新版本的cmake。
若是不指定安装的架构,vcpkg默认把开源库编译成x86的Windows版本的库。那vcpkg总共支持多少种架构呢?咱们可使用以下命令便知:
.\vcpkg.exe help triplet
咱们能够看到会列出以下清单:
这个清单之后随着版本的迭代还会再增长。vcpkg不只支持x86架构,还支持arm架构。注意:这里的arm架构特指相似于surface这种运行在arm处理器上的Win10平台,而并不是咱们传统意义上的Linux或android的ARM平台。
那若是要安装编译某一个架构的开源库,咱们该怎么写呢?咱们只须要在须要安装的包后面指定相应的triplet便可。例如咱们须要编译64位版本的jsoncpp,那么执行以下命令便可。
.\vcpkg.exe install jsoncpp:x64-windows
若是移除一个已经安装的开源库,那么执行remove指令便可。好比咱们要移除jsoncpp,那么执行命令:
.\vcpkg.exe remove jsoncpp
注意:
若是想要一键移除“过期”的包,执行命令:
.\vcpkg.exe remove --outdated
执行list指令便可,例如:
.\vcpkg.exe list
通常有两种更新方式。一个是update指令,能够显示能够升级的开源库的列表。另外一个是upgrade的指令,会从新编译全部须要更新的包。
有的时候,一个项目组中有不少人,不须要每一个人都参与编译。一我的编译好全部开源库后处处给别人便可。有的时候也是出于备份的目的,也会导出已经安装的开源库。导出能够执行export指令。例如,我要导出jsoncpp库,那么执行:
.\vcpkg.exe export jsoncpp --7zip
注意,导出时必须指定导出的包格式。vcpkg支持5种导出包格式,有:
参数 | 格式 |
---|---|
–raw | 以不打包的目录格式导出 |
–nuget | 以nuget包形式导出 |
–ifw | 我也不知道这是啥格式 |
–zip | 以zip压缩包形式导出 |
–7zip | 以7z压缩包形式导出 |
通常地,导出包的格式为:vcpkg-export-<日期>-<时间>
默认状况下只会导出x86-windows的包,若是要导出全部包,那须要制定相应的triplet。好比,若是同时导出x86和x64版本的jsoncpp,那执行命令:
.\vcpkg.exe export jsoncpp jsoncpp:x64-windows --7zip
这个命令等价于:
.\vcpkg.exe export jsoncpp:x86-windows jsoncpp:x64-windows --7zip
若是要指定输出目录和特定文件名,需使用”–output=”参数
导入比较简单,执行import指令便可。例如:
.\vcpkg.exe import xxx.7z
上面咱们已经安装了一些第三方库,那如何使用呢?常规状况下,咱们须要设置include目录、lib目录等,会有不少工做量。Vcpkg提供了一套机制,能够全自动的适配目录,而开发者不须要关心已安装的库的目录在哪里,也不须要设置。这是Vcpkg的一大优点。
“集成到全局”适用于Visual Studio开发环境和msbuild命令行。执行命令:
.\vcpkg integrate install
当出现“Applied user-wide integration for this vcpkg root.”字样的时候,说明已经集成成功。这时候能够在任意的工程中使用安装好的第三方库。
移除全局集成只要执行下列命令便可:
.\vcpkg integrate remove
上面已经能够集成到全局,为何还要“集成到工程”呢?由于在大部分状况下,咱们不但愿集成到全局,毕竟有不少第三方库咱们但愿自定义处理一下,或者干脆不想集成第三方库。那么集成到工程是最灵活的处理方式。也是工程级项目推荐的处理方式。
“集成到工程”是整个vcpkg中最复杂的一项,它须要利用Visual Studio 中的nuget插件来实现。咱们接下来一步一步来讲。
执行命令
.\vcpkg integrate project
这时候会在“\scripts\buildsystems”目录下,生成nuget配置文件.
其中是指vcpkg实际所在目录。
打开Visual Studio,点击菜单“工具->NuGet包管理器->程序包管理器设置”,进入设置界面,点击“程序包源”。
点击“加号”增长一个源。修改源的名字为vcpkg。在“源”的选项中点击右侧的”…”选择vcpkg目录下的“scripts\buildsystems”目录,而后点击右侧的“更新按钮”。
点击“肯定”,关闭设置对话框。
到此,全局性的设置已经完成,之后没必要再重复设置了。
用Visual Studio 打开一个工程或解决方案。右键点击须要设置的工程,选择“管理NuGet程序包”。在右上角的“程序包源”中选择刚刚设置的“vcpkg”。这样在“浏览”选项卡中就能够看到“vcpkg.H.Repos.vcpkg”。点击最右侧的“安装”。这样就能够集成到某个工程了。
最新的Visual Studio 2015和2017大力支持CMake工程,因此对cmake的支持固然不能少。在cmake中集成只要在cmake文件中加入下面这句话便可。
-DCMAKE_TOOLCHAIN_FILE=/scripts/buildsystems/vcpkg.cmake”
其中是指vcpkg实际所在目录。
Vcpkg默认编译连接的是动态库,若是要连接静态库,目前尚未简便的方法。须要作以下操做
<VcpkgTriplet>x86-windows-static</VcpkgTriplet>
<VcpkgEnabled>true</VcpkgEnabled>
在CMake中集成静态库,须要额外指令
cmake .. -DCMAKE_TOOLCHAIN_FILE=.../vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x86-windows-static
Vcpkg目前还在不断的完善中,但不能否认,它已经极大的减小了咱们在项目启动时,准备第三方库的时间。提升了工做效率。按照时髦的话来讲,就是避免了重复造轮子。目前Vcpkg已经集成了上百个经常使用的开源库,并且数量还在不停增加。毕竟是微软旗下的开源项目,质量仍是能够获得保障的,彻底能够在工业级项目中得以使用。源代码托管在github上,github社区很活跃,有兴趣的朋友也能够参与进来。
做者简介:陈建明,目前就任于上海恺英网络科技有限公司,C++专业组组长。