Vcpkg免配置实现分析

概述

通过Vcpkg安装library,能够不设定include、library的路径,而且可以自动复制依赖库,是利用到了Visual Studio,链接器,还有附带工具达成的。

Vcpkg的目录结构

Vcpkg免配置实现分析_第1张图片
vcpkg的目录结构
  • ports 可用包配置信息
  • downloads 库源代码包下载存放路径
  • buildtrees 库构造路径
  • packages 库编译结果
  • installed 库安装目录

其中installed存放了已安装信息,并且按照规则集中存放库内容

  • x86-windows 32位windows库
  • x64-windows
  • x86-windows-static 32位windows静态库
  • x64-windows-static
  • x86-uwp 32位uwp库
  • x64-uwp
  • arm-uwp

目录结构如下:

bin
debug
  bin
  lib
include
lib
share

也就是说,通过这种方式安装的库,是有统一的存放规则的,通过这些规则可以合并出对应的include、library、binary文件路径。

targets文件

Visual Studio的构建系统使用的是MSBuild,配置及构建目标定义都可以存放在.props和.targets文件中,由于安装的库遵循统一规则,因而在vcpkg\scripts\buildsystems\msbuild下可以找到完成上述统一配置的targets文件vcpkg.targets.


  
    true
    x86-windows
  

  
    true
    x86-uwp
  

  
    true
    x64-windows
  

  
    true
    x64-uwp
  

  
    true
    arm-uwp
  

  
    $(Configuration)
    $([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), .vcpkg-root))\installed\$(VcpkgTriplet)\
  

  
    
      %(AdditionalDependencies);$(VcpkgRoot)debug\lib\*.lib
      %(AdditionalDependencies);$(VcpkgRoot)lib\*.lib
      %(AdditionalLibraryDirectories);$(VcpkgRoot)lib;$(VcpkgRoot)lib\manual-link
      %(AdditionalLibraryDirectories);$(VcpkgRoot)debug\lib;$(VcpkgRoot)debug\lib\manual-link
    
    
      %(AdditionalIncludeDirectories);$(VcpkgRoot)include
    
  

  
    
    
        
    
    
        
    
  

可以看到,根据不同的配置信息,配置完成了include、library以及binary路径及对应的处理。

与Visual Studio 2015的整合

现在我们知道在Visual Studio 2015中免配置,是通过导入统一的targets来实现的,整合方式是什么样的?

在Visual Studio 2015中支持导入默认的配置,具体路径为:

$(MSBUILDLOCATION)/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/

其中$(MSBUILDLOCATION)通常为C:/Program Files (x86)/MSBuild/.

Vcpkg在执行整合时,会在该路径下创建vcpkg.system.targets文件,内容如下:



  
  
    $(LOCALAPPDATA)\vcpkg\vcpkg.user
  
  

$(LOCALAPPDATA)\vcpkg\下会创建vcpkg.user.targets来导入vcpkg路径下的.targets文件,譬如:



  

这种方式无论是通过Visual Studio 2015还是MSBuild构造工程都可以正确识别,但是Visual Studio 2010无法采用这种方式导入全局配置。

library免配置

常规的library配置会指定依赖的library名称,但是link实际上识别如下方式的lib依赖配置:

$(LibraryPath)/*.lib

采用这种方式,可以避免单独配置对应的库依赖,但是不适用于同一路径下存放了库的debug和release版本。

自动复制依赖的动态库

link.exe /dump /imports $(target)

以上的命令会输出目标导入的dll和所有符号,譬如:

Vcpkg免配置实现分析_第2张图片
输出动态库依赖

根据该命令能够得到所有依赖的动态库,然后根据binary路径进行复制。

vcpkg采用的方法:

dumpbin.exe /DEPENDENTS $(target)

输出如下:

Vcpkg免配置实现分析_第3张图片
dumpbin输出动态库依赖

你可能感兴趣的:(Vcpkg免配置实现分析)