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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容