pkgUser
提供給Visual Studio使用的C++工程配置工具
Inspired by Vcpkg
功能
- 提供面向Visual Studio解決方案的庫(kù)依賴配置
- 一次配置,后續(xù)全部可用
- 自動(dòng)處理庫(kù)依賴,復(fù)制運(yùn)行時(shí)依賴dll
注意:如果所使用庫(kù)的debug和release版本混合在一起,僅僅是用d來(lái)區(qū)分,會(huì)導(dǎo)致無(wú)法鏈接到正確的庫(kù)版本。
Why?
C++的工程配置是非常麻煩的,需要兼顧win32/x64,debug/release,在每種情況下都需要指定頭文件路徑、對(duì)應(yīng)庫(kù)路徑,還需要復(fù)制運(yùn)行時(shí)依賴的dll。
一直有一些工具來(lái)試圖簡(jiǎn)化這些復(fù)雜的配置步驟,譬如Vcpkg以及一些其它包管理工具,對(duì)其進(jìn)行簡(jiǎn)單的了解就發(fā)現(xiàn)其實(shí)C++的包管理也可以非常簡(jiǎn)單,可以做到和別的語(yǔ)言一樣,install后既可直接使用。
不幸的是這些工具在目前一些C++開(kāi)發(fā)人員工作場(chǎng)景中并不能使用,Vcpkg只支持Visual Studio 2015及以上版本,而且只是比較適用于穩(wěn)定的第三方庫(kù)。
pkgUser就是根據(jù)Vcpkg實(shí)現(xiàn)原理制作的工程配置工具,通過(guò)在統(tǒng)一的配置文件中指定所依賴庫(kù)的頭文件路徑、庫(kù)路徑和dll所在路徑,達(dá)到類似Vcpkg安裝后效果,可以直接inclue對(duì)應(yīng)的頭文件,而無(wú)須指定依賴的庫(kù),以及復(fù)制運(yùn)行時(shí)依賴的dll。
使用方法(Visual Studio 2010)
將pkgUser下載到特定目錄,譬如
D:\pkgUser\
將Custom.After.Microsoft.Common.targets復(fù)制到
"\Program Files (x86)\MSBuild\v4.0"
路徑下-
修改pkgUser.targets的內(nèi)容:
- 修改
<TLibrary>$(MSBuildThisFileDirectory)</TLibrary>
,將其調(diào)整為所使用庫(kù)的根目錄 - 針對(duì)不同的配置修改
TLLIBPATH
和TLDLLPATH
,保證其指定到所使用庫(kù)的庫(kù)路徑和dll所在位置 - 修改
TLINCPATH
使其指定到所使用庫(kù)的頭文件位置
- 修改
修改template.sln.targets中的pkgUserRootPath為pkgUser目錄,譬如
D:\pkgUser\pkgUser
,保證$(pkgUserRootPath).targets
指定到pkgUser.targets針對(duì)任何需要使用pkgUser的解決方案,將template.sln.targets復(fù)制到解決方案.sln所在文件夾,譬如針對(duì)
demo/demo.sln
,復(fù)制template.sln.targets
,并將名稱修改為demo.sln.targets
在解決方案的工程中直接使用對(duì)應(yīng)的庫(kù)
出錯(cuò)如何驗(yàn)證
-
驗(yàn)證
解決方案.sln.targets
是否正確配置只要Custom.After.Microsoft.Common.targets復(fù)制的位置正確,且
解決方案.sln.targets
放在對(duì)應(yīng)的sln目錄下,名稱正好是解決方案名稱+.sln.targets,那么解決方案中任何工程編譯成功后都會(huì)輸出如下消息:Generate By pkgUser: ******** liff.engineer@gmail.com ********* _ _ _ | | | | | | _ __ | | ____ _| | | |___ ___ _ __ | '_ \| |/ / _` | | | / __|/ _ \ '__| | |_) | ( (_| | |_| \__ \ __/ | | .__/|_|\_\__, |\___/|___/\___|_| | | __/ | |_| |___/
-
驗(yàn)證所使用庫(kù)配置是否正確
打開(kāi)解決方案中任何一個(gè)工程的
屬性
頁(yè)簽,定位到C/C++
的常規(guī)
,編輯附加包含目錄
,展開(kāi)宏
,輸入TL
,檢查TLibrary
、TLLIBPATH
等宏的值,確認(rèn)是否指定到正確的目錄。
如何實(shí)現(xiàn)
-
Visual Studio 配置擴(kuò)展點(diǎn)
Visual Studio自身預(yù)留了擴(kuò)展點(diǎn),可以將外部MSBuild配置腳本導(dǎo)入到指定工程中,譬如針對(duì)
Visual Studio 2010
,擴(kuò)展targets
文件可以放置在\Program Files (x86)\MSBuild\v4.0
下,名稱必須為Custom.After.Microsoft.Common.targets
,而Visual Studio 2017
社區(qū)版對(duì)應(yīng)路徑在\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\v15.0
下。查找對(duì)應(yīng)
Visual Studio
擴(kuò)展點(diǎn)位置的方法如下:- 隨便打開(kāi)一個(gè)C++工程
- 切換到
屬性
頁(yè)簽,定位到C/C++
的附加包含目錄
- 進(jìn)入編輯狀態(tài),打開(kāi)
宏
,輸入Custom
,找到CustomAfterMicrosoftCommonTargets
,其對(duì)應(yīng)值就是可以導(dǎo)入擴(kuò)展.targets
具體位置
-
自動(dòng)鏈接依賴庫(kù)
在指定所依賴的庫(kù)時(shí),除了配置庫(kù)路徑,然后設(shè)定依賴庫(kù),譬如
$(QtDir)\lib
與QtWidgetd.lib
,也可以使用$(libpath)\*.lib
,這種方式會(huì)根據(jù)鏈接符號(hào)去所有的*.lib
查詢,然后鏈接對(duì)應(yīng)的lib -
自動(dòng)復(fù)制所有依賴的dll
VS的SDK附帶了dumpbin.exe,以
/DEPENDENTS
為選項(xiàng)可以查詢目標(biāo)(*.dll/*.exe
)所依賴的所有dll,pkgUser.ps1就是根據(jù)這個(gè)操作,從所有的dll路徑中遞歸查詢目標(biāo)直接/間接依賴的所有dll。
如何擴(kuò)展
-
導(dǎo)入多個(gè)庫(kù)依賴
pkgUser.targets中的
TLibrary、TLLIBPATH、TLDLLPATH
等均是演示使用,實(shí)際使用中可以調(diào)整為對(duì)應(yīng)庫(kù)的名稱,<PropertyGroup>
節(jié)點(diǎn)下的項(xiàng)可以任意添加,在最終的userBinaryPaths
、userLibrarys
、userIncludePath
中添加上去,然后以;
分割開(kāi)即可 -
復(fù)制特定文件和目錄
該配置工具實(shí)現(xiàn)都是使用的
MSBuild
,只要符合MSBuild
的操作方法都可以添加