vcpkg —— VC++ 打包工具

Posted lenmom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vcpkg —— VC++ 打包工具相关的知识,希望对你有一定的参考价值。

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:171>节点 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新增库

以上是关于vcpkg —— VC++ 打包工具的主要内容,如果未能解决你的问题,请参考以下文章

win10 + vs2017 + vcpkg —— VC++ 打包工具

vs2015配置vcpkg

工程实践:Windows包管理工具——VCPKG

工程实践:Windows包管理工具——VCPKG

Visual Studio工具 vcpkg简介

我的C/C++语言学习进阶之旅关于Vcpkg的参考资料:一个让你可以快速引用C++开源库的包管理工具Vcpkg,快来使用Vcpkg管理你的C++ 项目中的依赖项吧!