新玩意:使用vcpkg來管理你的C++代碼庫

2021-01-15 漫漫開發路

vcpkg的2019.06更新

vcpkg是一個集成在宇宙級開發IDE(Visual Studio)中的一個組件,其主要用於代碼庫的管理及索引。在2019.06這次更新中,vcpkg現在可以用來在多個不同的平臺上來管理C/C++代碼庫。開發團隊為此還專門在github上專門創建了一個倉庫:microsoft/vcpkg.

代碼庫別名:Ports

開發團隊使用Ports這個名詞來表示各種可用的第三方代碼庫。在今年6月的更新中又新增44個新的代碼庫,這些加入進來的新夥計們包括:bdwgc, cJSON, greatest, immer, json-c以及zydis. 值得注意的是,開發團隊選擇代碼庫的其中一個原則是:這個代碼庫的star數是否足夠?上面列出來的幾個,star數基本都在1K以上。

截至目前,vcpkg的github倉中已經集成291個代碼庫。

代碼庫主頁

為了能讓開發者快速了解一個代碼庫,開發團隊將各個代碼庫的主頁也加入進來。例如,有一個代碼庫Abseil,只需要導航至:/ports/abseil/CONTROL,我們就可以看到一行主頁的連結信息,這樣就能方便的前往代碼庫主頁了解這個庫。

Overlay Ports

在vcpkg工具中,我們可以使用search/install等指令來管理代碼庫。另外,開發團隊還添加了一個所謂的:Overlay ports的特性。我們可以使用這個特性來制定不同版本的代碼庫,甚至用來創建私有的Port。

舉個慄子

在一個項目中,我想使用OpenCV視覺庫,並且由於項目的一些依賴原因,我需要使用的是3.0的版本。但是不巧的是,這個版本稍稍有點舊了,vcpkg中包含的版本是3.4.3, 所以,這就比較尷尬了。

解決此問題的方法時,我們在GitHub上創建一個私有的倉庫,然後將OpenCV3.0的代碼Checkin到這個倉,然後將這個私有倉提交到vcpkg的ports目錄,這樣項目成員就可以使用3.0版本的OpenCV了。

我們來看看具體的流程:

初始化git倉庫,並導入3.0版本OpenCV庫

接下來,項目團隊就可以使用vcpkg的overlay-ports參數來使用這個版本的代碼庫了。

當然,如果某一天,你又想使用最新版本的庫了,可以使用bootstrap-vcpkg.bat來更新vcpkg。

開發團隊目前在完善這個特性,所以你可能會碰到一些稀奇古怪的問題,這個時候,請到GitHub上的vcpkg的主頁提交問題給開發團隊。

Triplets

vcpkg默認提供多種目標平臺,例如Windows, Linux和WSL(Windows Subsystem for Linux)。目前開發團隊已經添加了Linux上可用的庫多達755個。我們看看下面的統計表格:

可以看到Windows平臺的ports最多,用於64位Windows的庫有1000多個。其他幾個平臺也有幾百個。如果你期望的目標平臺不在這個列表中,你還可以創建目標平臺,方法還挺簡單,具體得看看文檔了。微軟的文檔,我的感覺是又多又齊全,我這輩子應該是沒有機會全部看完了。

Overlay Triplets

和上面提到的Overlay Ports類似的,本次更新還包含Overlay Triplets特性。我們可以使用這個特性來Override默認的目標平臺,或者創建新的目標平臺。

舉個慄子

有些Linux用戶,可能需要動態連結庫,但是目前的x64-linux平臺中提供的是靜態的庫。那麼我們可以基於x64-linux平臺來新建一個新的Triplet,這個新Triplet將創建動態庫。

第一步,創建一個目錄用於保存新的Triplet。

然後,拷貝一份x64-linux的triplet文件,並重命名一個新的triplet名字。

修改新配置文件中的相關參數

具體到這個例子來說,我們將VCPKG_LIBRARY_LINKAGE的值由static修改為:dynamic。

最後,我們可以使用–overlay-triplets來安裝第三方庫了,安裝成功之後,就可以得到動態編譯出來的庫,而不是默認的靜態庫。

對代碼庫作者的支持

除了方便代碼庫的使用者,開發團隊還考慮到了代碼庫的作者。新增的幾個特性,可以幫助代碼庫作者提升開發效率和增強代碼的品質。

CI持續集成

開發團隊在Azure DevOps pipelines上添加了公共的測試代碼,這些測試代碼將測試搭建在GitHub上的vcpkg倉庫。開發者可以直接獲取編譯失敗日誌及靜態檢查失敗結果。例如:

可以通過圖標來指示Check是否成功。如果Check失敗,則還可以看到有關此次失敗的詳細信息:

在Azure DevOps的Summary頁面,可以下載所有失敗的日誌及相關的變更描述。

Check Features

通過vcpkg_check_features這個新特性,我們可以在檢查代碼庫的一個或者多個feature是否包含在庫中。例如,如果想啟用OpenCV的CUDA特性支持,可以使用如下指令:

vcpkg_check_features簡化了代碼庫的可選特性的創建過程,在之前的實踐中,可能需要編寫如下的腳本:

現在,只需要編寫如下腳本:

總結

vcpkg從一個VS中自帶的C++代碼管理組件,逐漸演化成今天的跨平臺的代碼管理組件,離不開開發團隊的辛勤工作,我們也可以從這個變化中看出:微軟的重心已經從Windows這條大船轉移到企業應用,雲服務及開源社區。這個變革在Ballmer時期是不可想像的,相信在Satya的領導下,微軟能在新的領域再創一個輝煌。

相關焦點

  • vcpkg更新及產品路線圖
    在過去的三月份裡,下面的所有人貢獻了PR並被合併到項目的主分支中,這些貢獻者中有微軟的vcpkg核心開發團隊成員,也有我們的合作夥伴Beyondsoft的團隊成員。目前我們總共有826名貢獻者,非常感謝你們投入寶貴的時間來開發並完善一個更好的庫管理工具。同時,我們非常期待著你也能加入到貢獻者的隊伍中來。
  • C++的轉換手段並與explicit關鍵詞配合使用
    >++作者:良知猶存轉載授權以及圍觀:歡迎添加微信公眾號:羽林君隱式轉化c++;(&pn) //無關類型指針轉換,編譯錯誤void*p = &n;double*d = static_cast<double*>(&p) //將void*轉化為初始的指針類型static_cast強制轉換隻會在編譯時檢查,但沒有運行時類型檢查來保證轉換的安全性
  • Facebook開源算法代碼庫PySlowFast,輕鬆復現前沿視頻理解模型
    而後,在今年的 ICCV 上,FAIR 推出了他們的視頻理解代碼庫:PySlowFast。PySlowfast 是一個基於 PyTorch 的代碼庫,讓研究者可以輕而易舉地復現從基礎至前沿的視頻識別 (Video Classification) 和行為檢測 (Action Detection) 算法。
  • 還不懂c++vector的用法,你憑什麼勇氣來的!
    今天給大家帶來一篇c++vector的介紹,難以置信這篇文章寫了我三天,不過總算整理完畢,現在分享給大家。模板類vector 和 array是數組的替代品。模板類vector 類似於string類,也是一種動態數組。 在 c++ 中,vector 是一個十分有用的容器。
  • 特性完成:VS2019 v16.8全面支持C++協程
    Standard Mode – /std:c++latest使用比C++17更新的編譯器語言版本模式時,就能實現對C++20協程的支持,同時,不帶有對舊版TS的支持。現在,這是/std:c++latest,在添加了C ++ 17之後,它將繼續進入編號版本的開關。
  • 「物聯網」Rust系列3:Rust如何避免C和c++的陷阱
    第一部分:「物聯網」Rust系列1:用Rust重寫了物聯網平臺並成功  第二部分:「物聯網」Rust系列(2):以火取光,C和C++的問題  所以現在我已經徹底,也許不公平烤幾個設計缺陷的一種程式語言超過四十歲,經營著世界上大多數嵌入式設備,讓我們來談談如何鏽設計出這些問題,同時仍然保留了C和c++的部分,讓他們強大的和有用的語言。
  • 36氪首發 | 以數據驅動研發團隊效能提升,代碼庫分析平臺「思碼逸...
    而思碼逸的做法是用代碼分析算法去理解程序,將代碼編譯為抽象語法樹,過濾掉不必要的空行和無用的代碼,更好的分析代碼庫中有效的邏輯量。 用程序去理解和評估程序並不是一件簡單的事情,這樣的技術深度也源於創始團隊之前的積累。
  • 使用Unity構建和移植移動遊戲
    當然,早期開發者也面臨著巨大的挑戰,包括硬體限制(例如,可用內存只有64k或更少)、使用低級語言(如彙編語言)和簡陋的開發工具。由於各個平臺使用的渲染處理器千差萬別,資產在藝術工具中的呈現結果,與在給定平臺上遊戲中的呈現結果往往存在脫節。此外,平臺的複雜性越來越高,為了支持所有這些子系統,代碼庫在不斷擴大,導致編譯和構建的時間冗長。
  • 谷歌下一代Pixel 5命名現身Android開源項目代碼庫
    現在該款新機又爆料出新動態,2月18日有消息稱在Android開源項目代碼庫中發現了Pixel 5的蹤跡,再度確認谷歌下一代Pixel機型將命名為「Pixel 5」。
  • 《寶可夢劍盾》新玩意在爆料!巨大化還能這麼玩!新特性、新背包
    《寶可夢劍盾》新玩意在爆料!巨大化還能這麼玩!來一起來看看吧~極巨化與極巨招式​極巨化寶可夢不僅身形變得巨大,一部分能力還會得到提升,所以會大幅影響寶可夢對戰的勝敗。並且,只有極巨化寶可夢才能使出的極巨招式不僅威力巨大,還附帶有強力的追加效果。
  • 如何使用React Hooks實現容器組件?
    今天,我們就來通過使用React Hooks實現容器組件。在開始使用React Hooks實現容器組件之前,先來簡單了解一下到底什麼是React Hooks和容器組件。筆者認為,當用戶真正想要將狀態與表示組件分離時,通常需要使用容器組件。因此,本文只著重闡述使用React Hooks來管理容器組件中的狀態這一點。現在已經解釋了什麼是React Hooks和容器組件的定義,接下將側重於論述如何在容器組件中應用Hooks函數。
  • 使用ftrack Studio管理你的動畫
    一些全球最優秀的動畫工作室如何使用ftrack Studio創作更好的藝術品並建立更多業務。從頭到尾計劃你的動畫計劃您的團隊應該在什麼時候做什麼工作。每天準確地了解您正在處理的鏡頭和事件,並設定截止日期和階段,以使您的團隊步入正軌。
  • c++ 內存,虛函數,運算函數,三角函數
    在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。C++ 動態內存棧:在函數內部聲明的所有變量都將佔用棧內存。堆:這是程序中未使用的內存,在程序運行時可用於動態分配內存。很多時候,您無法提前預知需要多少內存來存儲某個定義變量中的特定信息,所需內存的大小需要在運行時才能確定。在 C++ 中,您可以使用特殊的運算符為給定類型的變量在運行時分配堆內的內存,這會返回所分配的空間地址。這種運算符即 new 運算符。
  • 學點「新玩意」 把「疫情危機」變「教育契機」
    &nbsp&nbsp&nbsp&nbsp學打蝴蝶結、學做美食、拍攝短視頻,把「疫情危機」變「教育契機」&nbsp&nbsp&nbsp&nbsp停課不停學,還可以學點「新玩意」&
  • 表情符號(Emoji)是最新潮的語言,但你對它們的了解有多少?
    人們在社交應用裡聊天的時候,越來越多的會開始使用表情符號(Emoji)。年輕人更是表情符號的重度使用人群。每個人的手機裡肯定都有很多表情符號,很多人對這些符號的使用也非常熟練,在某些時候甚至可以完全用表情符號來展現一個複雜的句子。
  • SourceForge.NET 使用的開源軟體
    這篇文章介紹了SourceForge.NET 使用的開源軟體,各位不妨看一看
  • 如何通過wrap malloc定位C/C++程序的內存洩漏
    Java等程式語言會自動管理內存回收,而C/C++需要顯式的釋放,有很多手段可以避免內存洩漏,比如RAII,比如智能指針(大多基於引用計數計數),比如內存池。所以,我們需要藉助工具,比如valgrind,但這些找內存洩漏的工具,往往對你使用動態內存的方式有某種期待,或者說約束,比如常駐內存的對象會被誤報出來,然後真正有用的信息會掩蓋在誤報的汪洋大海裡。很多時候,甚至valgrind根本解決不了日常項目中的問題。
  • 百度大腦EasyDL的數據集、模型與代碼的版本管理:靈活管理效率提升
    在EasyData中,各個版本的數據是通過「數據集組」來管理的。在同一個組中,數據的類型需要保持一致,即需要都是圖片,或都是文本。在新增數據版本的時候,可以選擇從數據組中已有的版本中繼承數據,也可以選擇創建全新版本自己導入新數據。如下圖所示,在實際使用中,各個數據版本之間的關係是一個有向圖,EasyData的後臺也記錄了各個版本之間的關係,可以很容易地進行回溯生成歷史。
  • 20個讓你效率更高的CSS代碼技巧
    網絡上已經有成熟的CSS代碼庫為我們解決瀏覽器不一致問題,例如normalize.css、minireset和ress,你可以在你的項目中引用它們。如果你不想使用第三方代碼庫,你可以使用下面的樣式來進行一個非常基本的CSS reset:* {margin: 0;padding: 0;box-sizing: border-box;}上面的代碼看起來有些霸道,將所有元素的內外邊距都設置為0了,而正是沒有了這些默認內外邊距的影響,使得我們後面的CSS設置會更加的容易。
  • 使用PInvoke互操作,讓C Sharp 和C++愉快的交互優勢互補
    /WPF去做管理界面,C++還是在大學裡學過,好多年沒接觸了,為了練手這一篇用P/Invoke來將兩者相互打通。有一個注意的地方就是 extern "C",一定要用C方式導出,如果按照C++方式,Sum名稱會被編譯器自動修改,不信你把 extern "C" 去掉,我用ida打開給你看一下,被修改成了 ?Sum@@YAHHH@Z , 尷尬。