概述
Vcpkg使用起来确实比较方便,基本上是免工程配置,但是现在只支持Visual Studio 2015及以上版本,那么,是否有可能支持Visual Studio 2010呢?或者说支持各种Visual Studio版本?
局限从何而来
之前讲过,Vcpkg能够整合到Visual Studio 2015上是因为有MSBuild扩展点可以导入配置,扩展点在:
$(MSBUILDLOCATION)/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/
那么,如果能够找到Visual Studio 2010对应的MSBuild扩展点,就可以实现对应的库管理器。
Visual Studio 2010的扩展点
任意打开一个Visual Studio 2010的工程,在工程配置页签打开宏,输入custom
,即可看到:
也就是说,Visual Studio 2010的MSBuild也是支持扩展的,具体位置在:
C:\Program Files (x86)\MSBuild\v4.0\
在MicrosoftCommonTargets
之前和之后都可以插入对应的.Targets
。
支持Visual Studio 2010库的方法
- Vcpkg的triplet可以修改为
[x86/x64]-windows-[v100/v140]-static
类似这种组合方式; -
portfile.cmake
脚本中可以根据VCPKG_TOOLSET
得到对应的Visual Studio版本,然后执行对应的构建流程; - 在整合Visual Studio时,根据不同的版本写入调整不同的
.targets
文件来实现任何版本的库配置导入; - 根据不同的toolset和platform合成不同的triplet,来保证库导入正确。
延伸
如果不需要全局库管理,仅仅是针对于对应的sln或者vcxproj,从上述扩展思路延伸来看,可以实现局部库管理:
- 根据约定统一存放依赖库的include、library和binary
- 编写
librarys.targets
文件来完成库导入 - 编写与sln和vcxproj同名的
.targets
文件
使用$(MSBuildThisFileDirectory)
获取当前路径来保证相对位置:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Generate By pkgUser" AfterTargets="AfterBuild">
<Message Text="*** author:liff.engineer@gmail.com ***" Importance="high"/>
</Target>
<Import Condition="Exists('$(MSBuildThisFileDirectory)..\..\config\librarys.targets')" Project="$(MSBuildThisFileDirectory)..\..\config\librarys.targets"/>
</Project>
- 使用Visual Studio的扩展点导入
.targets
譬如,导入与sln路径下同名的库配置:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(SolutionPath).targets" Condition="Exists('$(SolutionPath).targets')" />
</Project>
通过上述步骤即可完成面向解决方案的库管理及配置。
网友评论