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

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)

  1. pkgUser下載到特定目錄,譬如D:\pkgUser\

  2. Custom.After.Microsoft.Common.targets復(fù)制到"\Program Files (x86)\MSBuild\v4.0"路徑下

  3. 修改pkgUser.targets的內(nèi)容:

    • 修改<TLibrary>$(MSBuildThisFileDirectory)</TLibrary>,將其調(diào)整為所使用庫(kù)的根目錄
    • 針對(duì)不同的配置修改TLLIBPATHTLDLLPATH,保證其指定到所使用庫(kù)的庫(kù)路徑和dll所在位置
    • 修改TLINCPATH使其指定到所使用庫(kù)的頭文件位置
  4. 修改template.sln.targets中的pkgUserRootPathpkgUser目錄,譬如D:\pkgUser\pkgUser,保證$(pkgUserRootPath).targets指定到pkgUser.targets

  5. 針對(duì)任何需要使用pkgUser的解決方案,將template.sln.targets復(fù)制到解決方案.sln所在文件夾,譬如針對(duì)demo/demo.sln,復(fù)制template.sln.targets,并將名稱修改為demo.sln.targets

  6. 在解決方案的工程中直接使用對(duì)應(yīng)的庫(kù)

出錯(cuò)如何驗(yàn)證

  1. 驗(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  *********
              _         _   _               
             | |       | | | |              
        _ __ | | ____ _| | | |___  ___ _ __ 
       | '_ \| |/ / _` | | | / __|/ _ \ '__|
       | |_) |   ( (_| | |_| \__ \  __/ |   
       | .__/|_|\_\__, |\___/|___/\___|_|   
       | |         __/ |                    
       |_|        |___/    
    
    
  2. 驗(yàn)證所使用庫(kù)配置是否正確

    打開(kāi)解決方案中任何一個(gè)工程的屬性頁(yè)簽,定位到C/C++常規(guī),編輯附加包含目錄,展開(kāi),輸入TL,檢查TLibraryTLLIBPATH等宏的值,確認(rèn)是否指定到正確的目錄。

如何實(shí)現(xiàn)

  1. 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)位置的方法如下:

    1. 隨便打開(kāi)一個(gè)C++工程
    2. 切換到屬性頁(yè)簽,定位到C/C++附加包含目錄
    3. 進(jìn)入編輯狀態(tài),打開(kāi),輸入Custom,找到CustomAfterMicrosoftCommonTargets,其對(duì)應(yīng)值就是可以導(dǎo)入擴(kuò)展.targets具體位置
  2. 自動(dòng)鏈接依賴庫(kù)

    在指定所依賴的庫(kù)時(shí),除了配置庫(kù)路徑,然后設(shè)定依賴庫(kù),譬如$(QtDir)\libQtWidgetd.lib,也可以使用$(libpath)\*.lib,這種方式會(huì)根據(jù)鏈接符號(hào)去所有的*.lib查詢,然后鏈接對(duì)應(yīng)的lib

  3. 自動(dòng)復(fù)制所有依賴的dll

    VS的SDK附帶了dumpbin.exe,以/DEPENDENTS為選項(xiàng)可以查詢目標(biāo)(*.dll/*.exe)所依賴的所有dllpkgUser.ps1就是根據(jù)這個(gè)操作,從所有的dll路徑中遞歸查詢目標(biāo)直接/間接依賴的所有dll

如何擴(kuò)展

  1. 導(dǎo)入多個(gè)庫(kù)依賴

    pkgUser.targets中的TLibrary、TLLIBPATH、TLDLLPATH等均是演示使用,實(shí)際使用中可以調(diào)整為對(duì)應(yīng)庫(kù)的名稱,<PropertyGroup>節(jié)點(diǎn)下的項(xiàng)可以任意添加,在最終的userBinaryPathsuserLibrarysuserIncludePath中添加上去,然后以;分割開(kāi)即可

  2. 復(fù)制特定文件和目錄

    該配置工具實(shí)現(xiàn)都是使用的MSBuild,只要符合MSBuild的操作方法都可以添加

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容