美文网首页
pkgUser-提供给Visual Studio使用的C++工程

pkgUser-提供给Visual Studio使用的C++工程

作者: 长不胖的Garfield | 来源:发表于2017-05-23 15:55 被阅读0次

    pkgUser

    提供给Visual Studio使用的C++工程配置工具
    Inspired by Vcpkg

    功能

    • 提供面向Visual Studio解决方案的库依赖配置
    • 一次配置,后续全部可用
    • 自动处理库依赖,复制运行时依赖dll

    注意:如果所使用库的debug和release版本混合在一起,仅仅是用d来区分,会导致无法链接到正确的库版本。

    Why?

    C++的工程配置是非常麻烦的,需要兼顾win32/x64,debug/release,在每种情况下都需要指定头文件路径、对应库路径,还需要复制运行时依赖的dll。

    一直有一些工具来试图简化这些复杂的配置步骤,譬如Vcpkg以及一些其它包管理工具,对其进行简单的了解就发现其实C++的包管理也可以非常简单,可以做到和别的语言一样,install后既可直接使用。

    不幸的是这些工具在目前一些C++开发人员工作场景中并不能使用,Vcpkg只支持Visual Studio 2015及以上版本,而且只是比较适用于稳定的第三方库。

    pkgUser就是根据Vcpkg实现原理制作的工程配置工具,通过在统一的配置文件中指定所依赖库的头文件路径、库路径和dll所在路径,达到类似Vcpkg安装后效果,可以直接inclue对应的头文件,而无须指定依赖的库,以及复制运行时依赖的dll。

    使用方法(Visual Studio 2010)

    1. pkgUser下载到特定目录,譬如D:\pkgUser\

    2. Custom.After.Microsoft.Common.targets复制到"\Program Files (x86)\MSBuild\v4.0"路径下

    3. 修改pkgUser.targets的内容:

      • 修改<TLibrary>$(MSBuildThisFileDirectory)</TLibrary>,将其调整为所使用库的根目录
      • 针对不同的配置修改TLLIBPATHTLDLLPATH,保证其指定到所使用库的库路径和dll所在位置
      • 修改TLINCPATH使其指定到所使用库的头文件位置
    4. 修改template.sln.targets中的pkgUserRootPathpkgUser目录,譬如D:\pkgUser\pkgUser,保证$(pkgUserRootPath).targets指定到pkgUser.targets

    5. 针对任何需要使用pkgUser的解决方案,将template.sln.targets复制到解决方案.sln所在文件夹,譬如针对demo/demo.sln,复制template.sln.targets,并将名称修改为demo.sln.targets

    6. 在解决方案的工程中直接使用对应的库

    出错如何验证

    1. 验证解决方案.sln.targets是否正确配置

      只要Custom.After.Microsoft.Common.targets复制的位置正确,且解决方案.sln.targets放在对应的sln目录下,名称正好是解决方案名称+.sln.targets,那么解决方案中任何工程编译成功后都会输出如下消息:

      Generate By pkgUser:
        ********  liff.engineer@gmail.com  *********
                _         _   _               
               | |       | | | |              
          _ __ | | ____ _| | | |___  ___ _ __ 
         | '_ \| |/ / _` | | | / __|/ _ \ '__|
         | |_) |   ( (_| | |_| \__ \  __/ |   
         | .__/|_|\_\__, |\___/|___/\___|_|   
         | |         __/ |                    
         |_|        |___/    
      
      
    2. 验证所使用库配置是否正确

      打开解决方案中任何一个工程的属性页签,定位到C/C++常规,编辑附加包含目录,展开,输入TL,检查TLibraryTLLIBPATH等宏的值,确认是否指定到正确的目录。

    如何实现

    1. Visual Studio 配置扩展点

      Visual Studio自身预留了扩展点,可以将外部MSBuild配置脚本导入到指定工程中,譬如针对Visual Studio 2010,扩展targets文件可以放置在\Program Files (x86)\MSBuild\v4.0下,名称必须为Custom.After.Microsoft.Common.targets,而Visual Studio 2017社区版对应路径在\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\v15.0下。

      查找对应Visual Studio扩展点位置的方法如下:

      1. 随便打开一个C++工程
      2. 切换到属性页签,定位到C/C++附加包含目录
      3. 进入编辑状态,打开,输入Custom,找到CustomAfterMicrosoftCommonTargets,其对应值就是可以导入扩展.targets具体位置
    2. 自动链接依赖库

      在指定所依赖的库时,除了配置库路径,然后设定依赖库,譬如$(QtDir)\libQtWidgetd.lib,也可以使用$(libpath)\*.lib,这种方式会根据链接符号去所有的*.lib查询,然后链接对应的lib

    3. 自动复制所有依赖的dll

      VS的SDK附带了dumpbin.exe,以/DEPENDENTS为选项可以查询目标(*.dll/*.exe)所依赖的所有dllpkgUser.ps1就是根据这个操作,从所有的dll路径中递归查询目标直接/间接依赖的所有dll

    如何扩展

    1. 导入多个库依赖

      pkgUser.targets中的TLibrary、TLLIBPATH、TLDLLPATH等均是演示使用,实际使用中可以调整为对应库的名称,<PropertyGroup>节点下的项可以任意添加,在最终的userBinaryPathsuserLibrarysuserIncludePath中添加上去,然后以;分割开即可

    2. 复制特定文件和目录

      该配置工具实现都是使用的MSBuild,只要符合MSBuild的操作方法都可以添加

    相关文章

      网友评论

          本文标题:pkgUser-提供给Visual Studio使用的C++工程

          本文链接:https://www.haomeiwen.com/subject/uoqgxxtx.html