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

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的操作方法都可以添加

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容