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.mzph.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…