vcpkg —— VC++ 打包工具
vcpkg 是微软 C++ 团队开发的在 Windows 上运行的 C/C++ 项目包管理工具,可以帮助您在 Windows 平台上获取 C 和 C++ 库.
vcpkg 自身也是使用 C++ 开发的 (而其他的 C++ 包管理大多并不是 C++ 开发的),并且 vcpkg 能够帮助用户在 Visual Studio 中,更好的使用这些安装好的库.
vcpkg 整合了 git,构建系统整合的 CMake,而绝大多数的 C++ 项目都可以直接或者间接的方式使用 CMake创建原生项目文件并构建.
vcpkg遵循一下原则:
-
开放源码
-
无需安装
-
支持重发构建
-
自定义生成
-
社区参与贡献
-
端口集成(与 BSD Ports 机制类似)
安装和自举:
git clone https://github.com/Microsoft/vcpkg
cd vcpkg
powershell -exec bypass scriptsootstrap.ps1
搜索库:
vcpkg search
安装库:
vcpkg install cpprestsdk
查看已安装的库:
vcpkg list
将库集成的 Visual Studio:
vcpkg integrate install
MSDN 介绍博文:
https://blogs.msdn.microsoft.com/vcblog/2016/09/19/vcpkg-a-tool-to-acquire-and-build-c-open-source-libraries-on-windows/
原文:https://github.com/Microsoft/vcpkg/blob/master/README.md#
Vcpkg
概述
Vcpkg可以帮组你获取Windows平台的C和C++库。这个工具和ecosystem正处于预览阶段。您的参与对vcpkg的成功是非常的重要。
运行vcpkghelp可以获取可用命令的简短描述。
快速教程
要求:
- Visual Studio 2015 Update 3 or
- Visual Studio 2017
- CMake 3.8.0 或更高干部 (备注: 如果你机器上没有找到,将会自动安装到你的机器上)
- git.exe 加入到path中
克隆vcpkg库
C:src>git clone https://github.com/Microsoft/vcpkg.git
然后运行
C:src>cd vcpkg
C:srcvcpkg>.ootstrap-vcpkg.bat
PS D:vcpkg> .ootstrap-vcpkg.bat
用于 .NET Framework 的 Microsoft (R) 生成引擎版本 15.4.8.50001
版权所有(C) Microsoft Corporation。保留所有权利。
生成启动时间为 2017/12/2 0:10:17。
1>节点 1 上的项目“D:vcpkg oolsrcdirs.proj”(默认目标)。
1>项目“D:vcpkg oolsrcdirs.proj”(1)正在节点 1 上生成“D:vcpkg oolsrcvcpkgvcpkg.vcxproj”(2) (Clean 个目标)。
2>CoreClean:
正在创建目录“Release”。
2>项目“D:vcpkg oolsrcvcpkgvcpkg.vcxproj”(2)正在节点 1 上生成“D:vcpkg oolsrcvcpkglibvcpkglib.vcxproj”(3) (Clean 个目标)
。
3>CoreClean:
正在创建目录“Release”。
3>已完成生成项目“D:vcpkg oolsrcvcpkglibvcpkglib.vcxproj”(Clean 个目标)的操作。
2>已完成生成项目“D:vcpkg oolsrcvcpkgvcpkg.vcxproj”(Clean 个目标)的操作。
1>项目“D:vcpkg oolsrcdirs.proj”(1)正在节点 1 上生成“D:vcpkg oolsrcvcpkgmetricsuploadervcpkgmetricsuploader.vcxproj”(
4) (Clean 个目标)。
4>CoreClean:
正在创建目录“Release”。
4>已完成生成项目“D:vcpkg oolsrcvcpkgmetricsuploadervcpkgmetricsuploader.vcxproj”(Clean 个目标)的操作。
1>项目“D:vcpkg oolsrcdirs.proj”(1)正在节点 1 上生成“D:vcpkg oolsrcvcpkgvcpkg.vcxproj”(2:2) (Build 个目标)。
2:2>项目“D:vcpkg oolsrcvcpkgvcpkg.vcxproj”(2:2)正在节点 1 上生成“D:vcpkg oolsrcvcpkglibvcpkglib.vcxproj”(3:4) (默认目标)。
3>PrepareForBuild:
正在创建目录“D:vcpkg oolsrcRelease”。
正在创建目录“Releasevcpkglib.tlog”。
InitializeBuildStatus:
正在创建“Releasevcpkglib.tlogunsuccessfulbuild”,因为已指定“AlwaysCreate”。
ClCompile:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86CL.exe
/c /I..include /Zi /nologo /W3 /WX- /diagnostics:classic /sdl /MP /O2 /Oi /Oy- /GL /D DISABLE_METRICS=0 /D "
VCPKG_VERSION=-2017-12-01-34d8c77d35089484f66d80299dc6f8303a994a84" /D _MBCS /D NDEBUG /D _MBCS /Gm- /EHsc /MD
/GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Yc"pch.h" /Fp"Releasevcpkglib.pch" /Fo"Release\" /
Fd"Releasevcpkglib.pdb" /Gd /TP /analyze- /errorReport:queue /std:c++latest ..srcpch.cpp
pch.cpp
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86CL.exe
/c /I..include /Zi /nologo /W3 /WX- /diagnostics:classic /sdl /MP /O2 /Oi /Oy- /GL /D DISABLE_METRICS=0 /D "
VCPKG_VERSION=-2017-12-01-34d8c77d35089484f66d80299dc6f8303a994a84" /D _MBCS /D NDEBUG /D _MBCS /Gm- /EHsc /MD
/GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Yu"pch.h" /Fp"Releasevcpkglib.pch" /Fo"Release\" /
Fd"Releasevcpkglib.pdb" /Gd /TP /analyze- /errorReport:queue /std:c++latest ..srcvcpkgasechecks.cpp ..s
rcvcpkgasechrono.cpp ..srcvcpkgasecofffilereader.cpp ..srcvcpkgaseenums.cpp ..srcvcpkgasefi
les.cpp ..srcvcpkgaselineinfo.cpp ..srcvcpkgasemachinetype.cpp ..srcvcpkgasestrings.cpp ..src
vcpkgasesystem.cpp ..srcvcpkginaryparagraph.cpp ..srcvcpkguild.cpp ..srcvcpkgcommands.autocomple
te.cpp ..srcvcpkgcommands.buildexternal.cpp ..srcvcpkgcommands.cache.cpp ..srcvcpkgcommands.ci.cpp ..
srcvcpkgcommands.contact.cpp ..srcvcpkgcommands.cpp ..srcvcpkgcommands.create.cpp ..srcvcpkgcomman
ds.dependinfo.cpp ..srcvcpkgcommands.edit.cpp ..srcvcpkgcommands.env.cpp ..srcvcpkgcommands.exportifw
.cpp ..srcvcpkgcommands.hash.cpp ..srcvcpkgcommands.import.cpp ..srcvcpkgcommands.integrate.cpp ..sr
cvcpkgcommands.list.cpp ..srcvcpkgcommands.owns.cpp ..srcvcpkgcommands.portsdiff.cpp ..srcvcpkgcomm
ands.search.cpp ..srcvcpkgcommands.version.cpp ..srcvcpkgdependencies.cpp ..srcvcpkgexport.cpp ..src
vcpkgglobalstate.cpp ..srcvcpkghelp.cpp ..srcvcpkginput.cpp ..srcvcpkginstall.cpp ..srcvcpkgmetr
ics.cpp ..srcvcpkgpackagespec.cpp ..srcvcpkgpackagespecparseresult.cpp ..srcvcpkgparagraphparseresult
.cpp ..srcvcpkgparagraphs.cpp ..srcvcpkgparse.cpp ..srcvcpkgpostbuildlint.buildtype.cpp ..srcvcpkg
postbuildlint.cpp ..srcvcpkg
emove.cpp ..srcvcpkgsourceparagraph.cpp ..srcvcpkgstatusparagraph.cpp ..
srcvcpkgstatusparagraphs.cpp ..srcvcpkg riplet.cpp ..srcvcpkgupdate.cpp ..srcvcpkgvcpkgcmdargument
s.cpp ..srcvcpkgvcpkglib.cpp ..srcvcpkgvcpkgpaths.cpp ..srcvcpkgversiont.cpp
checks.cpp
chrono.cpp
cofffilereader.cpp
enums.cpp
files.cpp
lineinfo.cpp
machinetype.cpp
strings.cpp
system.cpp
binaryparagraph.cpp
build.cpp
commands.autocomplete.cpp
commands.buildexternal.cpp
commands.cache.cpp
commands.ci.cpp
commands.contact.cpp
commands.cpp
commands.create.cpp
commands.dependinfo.cpp
commands.edit.cpp
commands.env.cpp
commands.exportifw.cpp
commands.hash.cpp
commands.import.cpp
commands.integrate.cpp
commands.list.cpp
commands.owns.cpp
commands.portsdiff.cpp
commands.search.cpp
commands.version.cpp
dependencies.cpp
export.cpp
globalstate.cpp
help.cpp
input.cpp
install.cpp
metrics.cpp
packagespec.cpp
packagespecparseresult.cpp
paragraphparseresult.cpp
paragraphs.cpp
parse.cpp
postbuildlint.buildtype.cpp
postbuildlint.cpp
remove.cpp
sourceparagraph.cpp
statusparagraph.cpp
statusparagraphs.cpp
triplet.cpp
update.cpp
vcpkgcmdarguments.cpp
vcpkglib.cpp
vcpkgpaths.cpp
versiont.cpp
Lib:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86Lib.ex
e /OUT:"D:vcpkg oolsrcReleasevcpkglib.lib" /NOLOGO /LTCG Releasepch.obj
Releasechecks.obj
Releasechrono.obj
Releasecofffilereader.obj
Releaseenums.obj
Releasefiles.obj
Releaselineinfo.obj
Releasemachinetype.obj
Releasestrings.obj
Releasesystem.obj
Releaseinaryparagraph.obj
Releaseuild.obj
Releasecommands.autocomplete.obj
Releasecommands.buildexternal.obj
Releasecommands.cache.obj
Releasecommands.ci.obj
Releasecommands.contact.obj
Releasecommands.obj
Releasecommands.create.obj
Releasecommands.dependinfo.obj
Releasecommands.edit.obj
Releasecommands.env.obj
Releasecommands.exportifw.obj
Releasecommands.hash.obj
Releasecommands.import.obj
Releasecommands.integrate.obj
Releasecommands.list.obj
Releasecommands.owns.obj
Releasecommands.portsdiff.obj
Releasecommands.search.obj
Releasecommands.version.obj
Releasedependencies.obj
Releaseexport.obj
Releaseglobalstate.obj
Releasehelp.obj
Releaseinput.obj
Releaseinstall.obj
Releasemetrics.obj
Releasepackagespec.obj
Releasepackagespecparseresult.obj
Releaseparagraphparseresult.obj
Releaseparagraphs.obj
Releaseparse.obj
Releasepostbuildlint.buildtype.obj
Releasepostbuildlint.obj
Release
emove.obj
Releasesourceparagraph.obj
Releasestatusparagraph.obj
Releasestatusparagraphs.obj
Release riplet.obj
Releaseupdate.obj
Releasevcpkgcmdarguments.obj
Releasevcpkglib.obj
Releasevcpkgpaths.obj
Releaseversiont.obj
vcpkglib.vcxproj -> D:vcpkg oolsrcReleasevcpkglib.lib
FinalizeBuildStatus:
正在删除文件“Releasevcpkglib.tlogunsuccessfulbuild”。
正在对“Releasevcpkglib.tlogvcpkglib.lastbuildstate”执行 Touch 任务。
3>已完成生成项目“D:vcpkg oolsrcvcpkglibvcpkglib.vcxproj”(默认目标)的操作。
2>PrepareForBuild:
正在创建目录“Releasevcpkg.tlog”。
InitializeBuildStatus:
正在创建“Releasevcpkg.tlogunsuccessfulbuild”,因为已指定“AlwaysCreate”。
ClCompile:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86CL.exe
/c /I..include /Zi /nologo /W3 /WX- /diagnostics:classic /sdl /MP /O2 /Oi /Oy- /GL /D _MBCS /D NDEBUG /D _MB
CS /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Release\" /Fd"Releasevc141.pdb
" /Gd /TP /analyze- /errorReport:queue /std:c++latest ..srcvcpkg.cpp
vcpkg.cpp
Link:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86link.e
xe /ERRORREPORT:QUEUE /OUT:"D:vcpkg oolsrcReleasevcpkg.exe" /NOLOGO winhttp.lib version.lib kernel32.lib u
ser32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.
lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.li
b oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /m
anifest:embed /DEBUG:FULL /PDB:"D:vcpkg oolsrcReleasevcpkg.pdb" /OPT:REF /OPT:ICF /LTCG:incremental /TLBID
:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:vcpkg oolsrcReleasevcpkg.lib" /MACHINE:X86 /SAFESEH Releasevcpkg.obj
D:vcpkg oolsrcReleasevcpkglib.lib
正在生成代码
All 11899 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
vcpkg.vcxproj -> D:vcpkg oolsrcReleasevcpkg.exe
FinalizeBuildStatus:
正在删除文件“Releasevcpkg.tlogunsuccessfulbuild”。
正在对“Releasevcpkg.tlogvcpkg.lastbuildstate”执行 Touch 任务。
2>已完成生成项目“D:vcpkg oolsrcvcpkgvcpkg.vcxproj”(Build 个目标)的操作。
1>项目“D:vcpkg oolsrcdirs.proj”(1)正在节点 1 上生成“D:vcpkg oolsrcvcpkgmetricsuploadervcpkgmetricsuploader.vcxproj”(
4:2) (Build 个目标)。
4>PrepareForBuild:
正在创建目录“Releasevcpkgmet.7D6FDEEB.tlog”。
InitializeBuildStatus:
正在创建“Releasevcpkgmet.7D6FDEEB.tlogunsuccessfulbuild”,因为已指定“AlwaysCreate”。
ClCompile:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86CL.exe
/c /I..include /Zi /nologo /W3 /WX- /diagnostics:classic /sdl /MP /O2 /Oi /Oy- /GL /D _MBCS /D NDEBUG /D _MB
CS /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Release\" /Fd"Releasevc141.pdb
" /Gd /TP /analyze- /errorReport:queue /std:c++latest ..srcvcpkgmetricsuploader.cpp
vcpkgmetricsuploader.cpp
Link:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503inHostX86x86link.e
xe /ERRORREPORT:QUEUE /OUT:"D:vcpkg oolsrcReleasevcpkgmetricsuploader.exe" /NOLOGO winhttp.lib version.lib
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib u
uid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell
32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAcc
ess='false'" /manifest:embed /DEBUG:FULL /PDB:"D:vcpkg oolsrcReleasevcpkgmetricsuploader.pdb" /OPT:REF /OP
T:ICF /LTCG:incremental /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:vcpkg oolsrcReleasevcpkgmetricsuploader
.lib" /MACHINE:X86 /SAFESEH Releasevcpkgmetricsuploader.obj
D:vcpkg oolsrcReleasevcpkglib.lib
正在生成代码
All 1535 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
vcpkgmetricsuploader.vcxproj -> D:vcpkg oolsrcReleasevcpkgmetricsuploader.exe
FinalizeBuildStatus:
正在删除文件“Releasevcpkgmet.7D6FDEEB.tlogunsuccessfulbuild”。
正在对“Releasevcpkgmet.7D6FDEEB.tlogvcpkgmetricsuploader.lastbuildstate”执行 Touch 任务。
4>已完成生成项目“D:vcpkg oolsrcvcpkgmetricsuploadervcpkgmetricsuploader.vcxproj”(Build 个目标)的操作。
1>已完成生成项目“D:vcpkg oolsrcdirs.proj”(默认目标)的操作。
已成功生成。
0 个警告
0 个错误
已用时间 00:00:28.30
然后,运行如下命令使计算机的所有用户都可以使用vcpkg (备注:需要管理员权限)
C:srcvcpkg> .vcpkg integrate install
PS D:vcpkg> .vcpkg integrate install
Applied user-wide integration for this vcpkg root.
All MSBuild C++ projects can now #include any installed libraries.
Linking will be handled automatically.
Installing new libraries will make them instantly available.
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake"
使用vcpkg安装任何的程序包,如:
C:srcvcpkg> .vcpkginstall sdl2 curl
最后,在Visual Studio 2015 or Visual Studio 2017创建新的项目或者打开已经存在的项目。你就可以使用#include引用头文件并使用安装的程序库。
示例sqlite
安装
查询sqlite对应的名称
vcpkg.exe search sqlite
libodb-sqlite 2.4.0 Sqlite support for the ODB ORM library
sqlite3 3.15.0 SQLite is a software library that implements a se...
If your library is not listed, please open an issue at:
https://github.com/Microsoft/vcpkg/issues
然后安装sqlite3
vcpkg.exe install sqlite3
-- CURRENT_INSTALLED_DIR=D:/vcpkg/installed/x86-windows
-- DOWNLOADS=D:/vcpkg/downloads
-- CURRENT_PACKAGES_DIR=D:/vcpkg/packages/sqlite3_x86-windows
-- CURRENT_BUILDTREES_DIR=D:/vcpkg/buildtrees/sqlite3
-- CURRENT_PORT_DIR=D:/vcpkg/ports/sqlite3/.
-- Downloading https://sqlite.org/2016/sqlite-amalgamation-3150000.zip...
-- Downloading https://sqlite.org/2016/sqlite-amalgamation-3150000.zip... OK
-- Testing integrity of downloaded file...
-- Testing integrity of downloaded file... OK
-- Extracting source D:/vcpkg/downloads/sqlite-amalgamation-3150000.zip
-- 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
-- Package x86-windows-rel
-- Package x86-windows-rel done
-- Package x86-windows-dbg
-- Package x86-windows-dbg done
-- Warning: Could not find a matching pdb file for:
D:/vcpkg/packages/sqlite3_x86-windows/bin/sqlite3.dll
D:/vcpkg/packages/sqlite3_x86-windows/debug/bin/sqlite3.dll
-- Performing post-build validation
-- Performing post-build validation done
Package sqlite3:x86-windows is installed
确认是否安装成功
vcpkg.exe list
安装64位版本
vcpkg.exe install sqlite3:x64-windows
使用
打开Visual Studio 2015 新建工程,main.cpp如下
#include <sqlite3.h>
#include <stdio.h>
int main(int argc,char** argv)
{
printf("%s
",sqlite3_libversion()):
return 0;
}
编译运行
FAQ
-
是否支持Visual Studio 2010 ?
否,后续我会介绍Vcpkg用到的“知识点”,可以为Visual Studio 2010开发相应工具提供借鉴。 -
是否支持静态编译库
是,例如vcpkg.exe install xxx:x86-windows-static -
没有我需要的库怎么办
自己写,后续我会介绍如何向Vcpkg新增库