C++ 的 VS 項目中引入跨平臺包管理工具 conan

我們知道 C++ 不像很多其他語言有包管理工具,比如 Python 有 pip,Java 有 maven,C# 有 nuget,JS 有 npm,Go 有 go mod,Rust 有 cargo,項目中需要自己手動引入第三方庫,手動維護帶來了很多麻煩。現在 C++ 也有了包管理工具,比如 VCpkg 和 conan,后者 conan 是跨平臺的,支持 Windows、Linux、MacOS 等平臺,并且支持多種編譯器,本文介紹一下如何在項目中引入 conan。

  1. nlohmann::json/3.11.3
  2. sqlite3/3.48.0

1. 包管理器 conan

1.1 最小化配置

1.1.1 安裝

Conan 基于 Python3 的工具,安裝好 python3(3.6以上) 后,用 python 的 pip?安裝 conan?很簡單:

pip install conan             # windows/linux下
brew install conan            # macos下
1.1.2 配置

conan 的配置文件有兩種,一種是?conanfile.txt?文本文件相當于配置:

[requires]
nlohmann_json/3.11.3
sqlite3/3.48.0[generators]
CMakeDeps
CMakeToolchain

這個配置文件用來配置我們需要的第三方庫,比如指定版本的 nlohmann_json 和 sqlite3。然后?generators?為我們指定的生成器。

另一種是?conanfile.py?的 python 腳本文件,我們用這個腳本文件可以結合 python 代碼獲得更靈活的能力:

from conan import ConanFileclass MyProjectConan(ConanFile):name = "mytestproj"version = "0.1"settings = "compiler", "build_type", "arch"generators = "CMakeDeps", "CMakeToolchain"def requirements(self):self.requires("nlohmann_json/3.11.3")self.requires("sqlite3/3.48.0", options={"shared": True})

在項目根目錄下創建?conanfile.py?文件,在其中的?requirements?配置我們需要的第三方庫。

NOTE! 這兩種配置文件是互斥的,只能選擇一種。

如果只是比較輕量級使用,可以用?conanfile.txt?配置文件,否則一般用?conanfile.py?腳本文件,以獲得最大自由度,比如我們可以寫 python 代碼將生成的?.lib.dll.so?和頭文件等拷貝到指定目錄下。

1.1.3 安裝第三方庫

項目根目錄下執行:

conan install .

之后 conan 會在文件根目錄生成?.cmake.sh.bat?等等一堆文件,這些文件都是 conan 生成的,用來給項目引入第三方庫的腳本文件,如何引入我們在后面介紹。

上面的方式會在根目錄下生成一堆文件,一般我會在根目錄下放一個?thridparty?目錄,將 conan 生成的文件都放在這個目錄下,這樣方便管理,然后一些本地的第三方庫或者驅動也用?mklink /d?命令創建軟鏈接,指向對應文件夾,這樣方便管理。

這是最小化配置的 conan 配置,我們可以在?conanfile.txt?或?conanfile.py?中配置更多的選項,比如指定第三方庫的版本、指定第三方庫的構建類型、指定第三方庫的構建選項等等。

下面介紹一下在 VS 項目中如何引入 conan。

2. VS 項目中引入 conan

2.1 修改配置文件

為了指定 conan 將我們的第三方庫生成到指定目錄,并且在生成結束后,將生成的?.dll?動態庫文件復制到可執行文件同級目錄,需要對?conanfile.py?進行一些改動:

import os
from conan import ConanFile
from conan.tools.files import copyclass MyProjectConan(ConanFile):name = "cef_131_mytest"version = "0.1"settings = "os", "compiler", "build_type", "arch"generators = "MSBuildDeps", "MSBuildToolchain"def requirements(self):self.requires("nlohmann_json/3.11.3")self.requires("sqlite3/3.48.0", options={"shared": True})def layout(self):self.folders.generators = os.path.join("thirdparty", "conan")self.folders.build = os.path.join("thirdparty", "conan", "build")def deploy(self):print(f"  -->deploying env: arch={self.settings.arch}, build_type={self.settings.build_type}")source_dir = os.path.join(self.dependencies["sqlite3"].package_folder, "bin")print(f"  -->deploy source_dir: {source_dir}")# 動態生成目標路徑(如 x64/Debug 或 x64/Release)arch = "x64" if self.settings.arch == "x86_64" else "x86"target_dir = os.path.join(os.getcwd(), arch, str(self.settings.build_type))print(f"  -->deploy target_dir: {target_dir}")# 復制 DLL 到項目輸出目錄dll_files = [f for f in os.listdir(source_dir) if f.endswith(".dll")]for dll_file in dll_files:print(f"    --> Copying {dll_file}")copy(self, dll_file, src=source_dir, dst=target_dir)

由于是 VS 項目,所以配置文件的 generators 使用的是 MSBuild 構建工具鏈。

然后在項目根目錄下:

conan install . -s build_type=Debug --build=missing --deployer-package=*

如果是 Release 模式:

conan install . -s build_type=Release --build=missing --deployer-package=*

此時會在?thirdparty/conan?目錄下生成?conandeps.props?等 VS 屬性表,然后我們可以通過公共配置文件的方式引入生成的 VS 屬性表,關于 VS 公共配置文件的使用方式參考?<C++ 中 VS 項目引入公共配置文件>

2.2 引入 VS 項目

對于上面的 generators 為?"MSBuildToolchain", "MSBuildDeps",使用的是 Microsoft Visual Studio 的 MSBuild 編譯工具鏈,此時在?conan install?命令會生成?props?文件供 VS 引入,如果使用的 generators 是?"CMakeToolchain", "CMakeDeps",那么會生成 CMake 相關的一系列文件,可以從?CMakeLists.txt?文件中引入 conan 管理的庫。

其中:

  • -Deps:為三方庫的所有依賴項生成 CMake 配置文件;
  • -Toolchain:根據傳遞給 conan 的系統、編譯器、架構等信息,生成 CMake 構建三方庫所需的所有信息。還會生成 cmake-presets 文件,以供一些 IDE 集成。

現在我們要引入的配置文件是 conan 在 install 的時候生成的?conandeps.props,在項目配置?.vcxproj?中加入:

<Import Project="$(SolutionDir)\thirdparty\conan\conandeps.props" Condition="exists('$(SolutionDir)\thirdparty\conan\conandeps.props')" Label="conandeps" />

這個?conandeps.props?文件會導入 conan 給每個引入的第三方庫生成的 props 配置文件:

第三方庫的 props 配置文件中會分別引入其 Debug 和 Rlease 版本的目錄配置和變量配置,其中指定了將第三方庫目錄和包含目錄存放的具體位置,在項目?.vcxproj?中cli引入?conandeps.props?之后重啟 VS,就可以從 conan 的緩存目錄里直接?#include?相應庫的頭文件了。


網上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發現錯誤,歡迎留言指出,如果本文幫助到了你,別忘了點贊支持一下,你的點贊是我更新的最大動力!~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82793.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode 默認環境路徑

1.下面放在項目根目錄上&#xff1a; .vscode/settings.json 2.settings.json內容&#xff1a; {"python.analysis.extraPaths": ["${workspaceFolder}"],"python.defaultInterpreterPath": "/shared_disk/users/lbg/envs/py310_see3d/b…

Android 項目中配置了多個 maven 倉庫,但依賴還是下載失敗,除了使用代理,還有其他方法嗎?

文章目錄 前言解決方案gradlemaven 倉庫 前言 我們在Android 開發的過程中&#xff0c;經常會遇到三方依賴下載不下來的問題。一般情況下我們會在項目的build.gradle文件中配置多個 maven 倉庫來解決。 // Top-level build file where you can add configuration options com…

uni-app 引入vconsole web端正常,安卓端報錯 Cannot read property ‘sendBeacon‘ of undefined

reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端&#xff0c;…

火山RTC 7 獲得遠端裸數據

一、獲得遠端裸數據 1、獲得h264數據 1&#xff09;、遠端編碼后視頻數據監測器 /*** locale zh* type callback* region 視頻管理* brief 遠端編碼后視頻數據監測器<br>* 注意&#xff1a;回調函數是在 SDK 內部線程&#xff08;非 UI 線程&#xff09;同步拋出來的&a…

web 自動化之 Unittest 四大組件

文章目錄 一、如何開展自動化測試1、項目需求分析&#xff0c;了解業務需求 web 功能納入自動化測試2、選擇何種方式實現自動化測試 二、Unittest 框架三、TestCase 測試用例四、TestFixture 測試夾具 執行測試用例前的前置操作及后置操作五、TestSuite 測試套件 & TestLoa…

42、在.NET 中能夠將?靜態的?法覆寫成靜態?法嗎?

在.NET中&#xff0c;不能將非靜態方法&#xff08;實例方法&#xff09;直接覆寫&#xff08;Override&#xff09;為靜態方法&#xff08;Static Method&#xff09;。以下是關鍵原因和解釋&#xff1a; 1. 方法綁定的本質區別 實例方法&#xff1a;屬于對象的實例&#xf…

8天Python從入門到精通【itheima】-1~5

目錄 1節&#xff1a; 1.Python的優勢&#xff1a; 2.Python的獨具優勢的特點&#xff1a; 2節-初識Python&#xff1a; 1.Python的起源 2.Python廣泛的適用面&#xff1a; 3節-什么是編程語言&#xff1a; 1.編程語言的作用&#xff1a; 2.編程語言的好處&#xff1a;…

3D迷宮探險:偽3D渲染與運動控制的數學重構

目錄 3D迷宮探險:偽3D渲染與運動控制的數學重構引言第一章 偽3D渲染引擎1.1 射線投射原理1.2 紋理透視校正第二章 迷宮生成算法2.1 圖論生成模型2.2 復雜度控制第三章 第一人稱控制3.1 運動微分方程3.2 鼠標視角控制第四章 碰撞檢測優化4.1 層級檢測體系4.2 滑動響應算法第五章…

mac一鍵安裝gpt-sovit教程中,homebrew卡住不動的問題

mac一鍵安裝gpt-sovit教程 僅作為安裝過程中解決homebrew卡住問題的記錄 資源地址 https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/znoph9dtetg437xb#mlAoP 下載一鍵包 下載后并解壓&#xff0c;找到install for mac.sh&#xff0c;終端執行bash空格拖拽in…

git 遠程倉庫管理詳解

Git 的遠程倉庫管理是多人協作和代碼共享的核心功能。以下是 Git 遠程倉庫管理的詳細說明&#xff0c;包括常用操作、命令和最佳實踐。 1. 什么是遠程倉庫&#xff1f; 遠程倉庫&#xff08;Remote Repository&#xff09;&#xff1a;存儲在網絡服務器上的 Git 倉庫&#xff0…

【超詳細教程】安卓模擬器如何添加本地文件?音樂/照片/視頻一鍵導入!

作為一名安卓開發者或手游愛好者&#xff0c;安卓模擬器是我們日常工作和娛樂的重要工具。但很多新手在使用過程中常常遇到一個共同問題&#xff1a;**如何將電腦本地的音樂、照片、視頻等文件導入到安卓模擬器中&#xff1f;**今天&#xff0c;我將為大家帶來一份全網最詳細的…

使用vite重構vue-cli的vue3項目

一、修改依賴 首先修改 package.json&#xff0c;修改啟動方式與相應依賴 移除vue-cli并下載vite相關依賴&#xff0c;注意一些peerDependency如fast-glob需要手動下載 # 移除 vue-cli 相關依賴 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…

uniapp|實現手機通訊錄、首字母快捷導航功能、多端兼容(H5、微信小程序、APP)

基于uniapp實現帶首字母快捷導航的通訊錄功能,通過拼音轉換庫實現漢字姓名首字母提取與分類,結合uniapp的scroll-view組件與pageScrollTo API完成滾動定位交互,并引入uni-indexed-list插件優化索引欄性能。 目錄 核心功能實現動態索引欄生成?聯系人列表渲染?滾動定位聯動性…

C#中SetProperty方法使用

SetProperty 是 MVVM&#xff08;Model-View-ViewModel&#xff09; 模式中用于實現 屬性變更通知&#xff08;INotifyPropertyChanged&#xff09; 的核心方法&#xff0c;主要用于在屬性值變化時自動更新 UI 綁定。 1. SetProperty 的基本作用 更新字段值&#xff1a;修改屬性…

MYSQL 全量,增量備份與恢復

目錄 一 數據備份的重要性 1 數據備份的重要性 2 數據庫備份類型 2.1 從物理與邏輯的角度分類 2.2. 從數據庫的備份策略角度分類從數據庫的備份策略角度,數據庫的備份可分為完全備份、差異備份和增量備份。 3 常見的備份方法 3.1 物理冷備份 物理冷備份時需要在數據庫處…

豆瓣電影Top250數據工程實踐:從爬蟲到智能存儲的技術演進(含完整代碼)

目錄 引言:當豆瓣榜單遇見大數據技術 項目文檔 1.1 選題背景 1.2 項目目標 2. 項目概述 2.1 系統架構設計 2.2 技術選型 2.3 項目環境搭建 2.3.1 基礎環境準備 2.3.2 爬蟲環境配置 2.3.3 Docker安裝ES連接Kibana 安裝IK插件 2.3.4 vscode依賴服務安裝 3. 核心模…

深度 |國產操作系統“破繭而出”:鴻蒙電腦填補自主生態空白

真心為國內能有像華為這樣的技術型公司而自豪&#xff0c;一步步突圍技術封鎖。從這篇信息&#xff0c;可以給軟件從業者一個啟示&#xff1a;鴻蒙生態將是一個新的機會&#xff0c;值得好好把握。 鴻蒙電腦正成為中國電子信息技術新坐標。 超10億鴻蒙生態設備、2800家鴻蒙智…

【網絡安全】——大端序(Big-Endian)??和??小端序(Little-Endian)

字節序&#xff08;Endianness&#xff09;是計算機系統中多字節數據&#xff08;如整數、浮點數&#xff09;在內存中存儲或傳輸時&#xff0c;??字節排列順序??的規則。它分為兩種類型&#xff1a;??大端序&#xff08;Big-Endian&#xff09;??和??小端序&#xf…

六個倉庫合并為一個倉庫,保留master和develop分支的bat腳本

利用git subtree可以實現多個倉庫合并為一個倉庫&#xff0c;手動操作起來太麻煩了&#xff0c;今天花了點時間寫了一個可執行的腳本&#xff0c;現在操作起來就方便多了。 1、本地新建setup.bat文件 2、用編輯器打開&#xff08;我用的是Notepad&#xff09; 3、把下面代碼…

使用定時器監視當前PID 如果當前程序關閉 UI_Core.exe 也隨之自動關閉實現方法

使用定時器監視當前PID 如果當前程序關閉 UI_Core.exe 也隨之自動關閉實現方法 描述: C20 QT6.9 VS2022 中使用QProcess::startDetached(“UI_Core.exe”, QStringList(), QString(), &UI_Manage_pid);是啟動目標程序 能否同時告訴目標程序當前宿主程序的PID,在UI_CORE.EX…