概述
通过Vcpkg安装library,能够不设定include、library的路径,而且可以自动复制依赖库,是利用到了Visual Studio,链接器,还有附带工具达成的。
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和所有符号,譬如:
根据该命令能够得到所有依赖的动态库,然后根据binary路径进行复制。
vcpkg采用的方法:
dumpbin.exe /DEPENDENTS $(target)
输出如下: