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)
將pkgUser下載到特定目錄,譬如
D:\pkgUser\
將Custom.After.Microsoft.Common.targets復制到
"\Program Files (x86)\MSBuild\v4.0"
路徑下-
修改pkgUser.targets的內容:
- 修改
<TLibrary>$(MSBuildThisFileDirectory)</TLibrary>
,將其調整為所使用庫的根目錄 - 針對不同的配置修改
TLLIBPATH
和TLDLLPATH
,保證其指定到所使用庫的庫路徑和dll所在位置 - 修改
TLINCPATH
使其指定到所使用庫的頭文件位置
- 修改
修改template.sln.targets中的pkgUserRootPath為pkgUser目錄,譬如
D:\pkgUser\pkgUser
,保證$(pkgUserRootPath).targets
指定到pkgUser.targets針對任何需要使用pkgUser的解決方案,將template.sln.targets復制到解決方案.sln所在文件夾,譬如針對
demo/demo.sln
,復制template.sln.targets
,并將名稱修改為demo.sln.targets
在解決方案的工程中直接使用對應的庫
出錯如何驗證
-
驗證
解決方案.sln.targets
是否正確配置只要Custom.After.Microsoft.Common.targets復制的位置正確,且
解決方案.sln.targets
放在對應的sln目錄下,名稱正好是解決方案名稱+.sln.targets,那么解決方案中任何工程編譯成功后都會輸出如下消息:Generate By pkgUser: ******** liff.engineer@gmail.com ********* _ _ _ | | | | | | _ __ | | ____ _| | | |___ ___ _ __ | '_ \| |/ / _` | | | / __|/ _ \ '__| | |_) | ( (_| | |_| \__ \ __/ | | .__/|_|\_\__, |\___/|___/\___|_| | | __/ | |_| |___/
-
驗證所使用庫配置是否正確
打開解決方案中任何一個工程的
屬性
頁簽,定位到C/C++
的常規
,編輯附加包含目錄
,展開宏
,輸入TL
,檢查TLibrary
、TLLIBPATH
等宏的值,確認是否指定到正確的目錄。
如何實現
-
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
擴展點位置的方法如下:- 隨便打開一個C++工程
- 切換到
屬性
頁簽,定位到C/C++
的附加包含目錄
- 進入編輯狀態,打開
宏
,輸入Custom
,找到CustomAfterMicrosoftCommonTargets
,其對應值就是可以導入擴展.targets
具體位置
-
自動鏈接依賴庫
在指定所依賴的庫時,除了配置庫路徑,然后設定依賴庫,譬如
$(QtDir)\lib
與QtWidgetd.lib
,也可以使用$(libpath)\*.lib
,這種方式會根據鏈接符號去所有的*.lib
查詢,然后鏈接對應的lib -
自動復制所有依賴的dll
VS的SDK附帶了dumpbin.exe,以
/DEPENDENTS
為選項可以查詢目標(*.dll/*.exe
)所依賴的所有dll,pkgUser.ps1就是根據這個操作,從所有的dll路徑中遞歸查詢目標直接/間接依賴的所有dll。
如何擴展
-
導入多個庫依賴
pkgUser.targets中的
TLibrary、TLLIBPATH、TLDLLPATH
等均是演示使用,實際使用中可以調整為對應庫的名稱,<PropertyGroup>
節點下的項可以任意添加,在最終的userBinaryPaths
、userLibrarys
、userIncludePath
中添加上去,然后以;
分割開即可 -
復制特定文件和目錄
該配置工具實現都是使用的
MSBuild
,只要符合MSBuild
的操作方法都可以添加