【conan】c++包管理工具,conan教程

news2025/1/20 1:35:00

文章目录

  • 介绍
  • Build a simple CMake project using Conan
  • Using build tools as Conan packages
  • Building for multiple configurations:Release, Debug, Static and Shared 修改Conan profile,达到自己的编译目的
  • Understanding the flexibility of using conanfile.py vs conanfile.txt
  • How to cross-compile your applications using Conan: host and build contexts
  • Introduction to versioning 第三方包的版本控制

介绍

1.X 和 2.X 区别挺大的,2.X 更强了,这篇文章就是我学习2.X 的学习记录,耐心跟官网的教程走一遍,基本就会用这个工具了。

1.X 的文档:
https://docs.conan.io/en/1.46/introduction.html

2.X 的文档:
https://docs.conan.io/2/tutorial/consuming_packages.html

Build a simple CMake project using Conan

跟着官网教程做一遍。

1、pip install conan后,conan最新是2.0.x的版本;
2、CMakeLists.txt 里这样去找的:

在这里插入图片描述

3、conanfile.txt 写需要的包。
[generators] generators告诉Conan生成编译器或构建系统将用于查找依赖项和构建项目所需的文件。在这种情况下,由于我们的项目基于CMake,我们将使用CMakeDeps生成关于Zlib库文件安装位置的信息,并使用CMakeToolchain通过CMake工具链文件将构建信息传递给CMake。
在这里插入图片描述
4、Conan profile 是必须的文件。Conan配置文件允许用户定义一组配置,如编译器、构建配置、架构、共享或静态库等。Conan默认不会自动检测配置文件,因此我们需要创建一个配置文件。如果想让Conan尝试根据当前操作系统和已安装的工具来猜测配置文件,请运行以下命令:

conan profile detect --force

我用这个命令检测出来的还是有点错误,手动修改需要首先用这个指令看默认的文件在哪里:

conan profile path default

然后修改成自己想要的:

在这里插入图片描述
5、最终使用conan install。

Conan从我们在教程开始时配置的远程服务器上安装了Zlib库。该服务器存储了Conan配方,这些配方定义了如何构建库,并且还存储了可以重用的二进制文件,因此我们不必每次都从源代码构建。

Conan在build文件夹下生成了几个文件。这些文件由我们在conanfile.txt中设置的CMakeToolchain和CMakeDeps生成器生成。CMakeDeps生成文件以便CMake可以找到我们刚刚下载的Zlib库。另一方面,CMakeToolchain为CMake生成一个工具链文件,以便我们可以使用与默认配置文件检测到的相同设置透明地使用CMake构建项目。

conan install . --output-folder=build --build=missing

Using build tools as Conan packages

Conan可以帮你搞定不同版本的CMake。你只要在conanfile.txt写出:

[tool_requires]
cmake/3.22.6

可以在Conan中声明此依赖关系,使用一种名为tool_requires的要求类型。让我们看一个示例,了解如何向我们的项目添加tool_requires,并使用不同的CMake版本来构建它。

在这里插入图片描述
这个操作会在build文件夹中产生一个cmake的可执行程序,可以用你想要的cmake版本去编译程序:

在这里插入图片描述

Building for multiple configurations:Release, Debug, Static and Shared 修改Conan profile,达到自己的编译目的

目前为止,我们构建了一个简单的CMake项目,该项目依赖于zlib库,并学习了tool_requires,这是一种用于构建工具(如CMake)的特殊要求类型。在这两种情况下,我们没有在任何地方指定我们希望以发布模式还是调试模式构建应用程序,或者我们希望链接静态库还是共享库。这是因为如果没有另外指示,Conan将使用在“default profile”中声明的默认配置。在第一个示例中运行conan profile detect命令时,该默认配置文件是自动生成的。

Conan profile有不同的部分。[settings]部分包含有关操作系统、架构、编译器和构建配置等信息。当您调用Conan命令并设置–profile参数时,Conan将获取配置文件中的所有信息,并应用于您要构建或安装的软件包。如果您没有指定该参数,相当于使用–profile=default进行调用。这两个命令的行为是相同的:

$ conan install . --build=missing
$ conan install . --build=missing --profile=default

您可以存储不同的配置文件,并使用它们来针对不同的设置进行构建。例如,可以使用build_type=Debug,或在使用该配置文件构建的所有软件包中添加tool_requires。一个调试配置文件的示例如下所示:

[settings]
os=Macos
arch=x86_64
compiler=apple-clang
compiler.version=14.0
compiler.libcxx=libc++
compiler.cppstd=gnu11
build_type=Debug

使用配置文件Conan profile不是设置要使用的配置的唯一方法。您还可以在Conan命令中使用–settings参数覆盖配置文件Conan profile中的设置。例如,您可以在调试配置中构建先前示例中的项目,而不是发布配置。

$ conan install . --output-folder=build --build=missing --settings=build_type=Debug

到目前为止,我们一直在应用程序中静态链接Zlib。这是因为在Zlib的Conan包中,默认设置了以静态方式构建的属性。我们可以通过使用–options参数将shared选项设置为True,来改变从静态链接到共享链接。请执行以下命令来进行设置:

conan install . --output-folder=build --build=missing --options=zlib/1.2.11:shared=True

这样做后,Conan将安装Zlib的共享库,生成使用它们构建的文件,并且还会在运行应用程序时生成必要的文件来定位这些动态库。在将应用程序配置为使用共享库链接Zlib之后,让我们再次构建应用程序:

$ cd build
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
$ cmake --build . --config Release

现在,如果您尝试运行编译后的可执行文件,您会看到一个错误,因为该可执行文件找不到我们刚刚安装的Zlib的共享库。

$ ./compressor

这是因为共享库(在Windows中是.dll,在OSX中是.dylib,在Linux中是.so)是在运行时加载的。这意味着应用程序可执行文件需要知道在运行时需要哪些共享库的位置。在Windows上,动态链接器将先搜索相同的目录,然后再搜索PATH目录。在OSX上,它将搜索在DYLD_LIBRARY_PATH中声明的目录,而在Linux上则使用LD_LIBRARY_PATH。

Conan提供了一种机制来定义这些变量,并使可执行文件能够找到和加载这些共享库。这个机制是VirtualRunEnv生成器。如果您检查输出文件夹,您会看到Conan生成了一个名为conanrun.sh/bat的新文件。这是在进行conan安装时激活共享选项时自动调用VirtualRunEnv生成器的结果。这个生成的脚本将设置PATH、LD_LIBRARY_PATH、DYLD_LIBRARY_PATH和DYLD_FRAMEWORK_PATH环境变量,以便可执行文件可以找到共享库。

$ source conanrun.sh
$ ./compressor

Understanding the flexibility of using conanfile.py vs conanfile.txt

从conanfile.txt迁移到conanfile.py,可以提供更高的灵活性。下面的这个是conanfile.txt:

[requires]
zlib/1.2.11

[tool_requires]
cmake/3.22.6

[generators]
CMakeDeps
CMakeToolchain

等价于下面这个conanfile.py,继承ConanFile类,复写属性settings、generators,方法self.requires、self.tool_requires表述需求。

from conan import ConanFile


class CompressorRecipe(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeToolchain", "CMakeDeps"

    def requirements(self):
        self.requires("zlib/1.2.11")

    def build_requirements(self):
        self.tool_requires("cmake/3.22.6")

在之前的示例中,每次执行conan install命令时,我们都必须使用–output-folder参数来定义我们想要创建Conan生成文件的位置。有一种更简洁的方法可以决定我们希望Conan为构建系统生成文件的位置,这样我们可以根据所使用的CMake生成器的类型决定是否使用不同的输出文件夹。你可以直接在conanfile.py文件中的layout()方法中定义这个位置,并使其适用于每个平台,而不需要添加更多的更改。

import os

from conan import ConanFile


class CompressorRecipe(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeToolchain", "CMakeDeps"

    def requirements(self):
        self.requires("zlib/1.2.11")

    def build_requirements(self):
        self.tool_requires("cmake/3.22.6")

    def layout(self):
        # We make the assumption that if the compiler is msvc the
        # CMake generator is multi-config
        multi = True if self.settings.get_safe("compiler") == "msvc" else False
        if multi:
            self.folders.generators = os.path.join("build", "generators")
        else:
            self.folders.generators = os.path.join("build", str(self.settings.build_type), "generators")

正如你所看到的,我们在layout()方法中定义了self.folders.generators属性。这是Conan生成的所有辅助文件(CMake工具链和CMake依赖文件)放置的文件夹。

请注意,如果是多配置生成器(如Visual Studio),文件夹的定义与单配置生成器(如Unix Makefiles)不同。在第一种情况下,无论构建类型如何,文件夹都是相同的,构建系统将在该文件夹内管理不同的构建类型。但是像Unix Makefiles这样的单配置生成器,必须为每个不同的配置(如不同的构建类型Release/Debug)使用不同的文件夹。在这种情况下,我们添加了一个简单的逻辑来判断如果编译器名称是msvc,则考虑多配置。请注意,如果运行与之前示例中相同的命令但没有–output-folder参数,将会得到与之前相同的结果。

使用raise ConanInvalidConfiguration去引发异常:

...
from conan.errors import ConanInvalidConfiguration

class CompressorRecipe(ConanFile):
    ...

    def validate(self):
        if self.settings.os == "Macos" and self.settings.arch == "armv8":
            raise ConanInvalidConfiguration("ARM v8 not supported in Macos")

How to cross-compile your applications using Conan: host and build contexts

交叉编译:比如编译平台是ubuntu,而运行平台是Android。

之前写的:

$ conan install . --build=missing --profile=someprofile

其实是等价于:

$ conan install . --build=missing --profile:host=someprofile --profile:build=default

profile:host: 这是定义构建二进制文件所运行平台的配置文件。【运行平台是Android】
profile:build: 这是定义构建二进制文件的平台的配置文件。【编译平台是ubuntu】

请注意,当您只使用一个参数来确定配置文件时,–profile与–profile:host等效。如果您不指定–profile:build参数,Conan将在内部使用default 配置文件。

Introduction to versioning 第三方包的版本控制

conanfile.py

from conan import ConanFile


class CompressorRecipe(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeToolchain", "CMakeDeps"

    def requirements(self):
        self.requires("zlib/[~1.2]")

zlib/[~1.2] ,意味着在conan center 找类似于zlib/1.2.8, zlib/1.2.11 or zlib/1.2.12中的最新版本包。

zlib/[<1.2.12],如果这么写,就是找这个版本以下的,不包含这个版本。类似地使用大于小于等于就可以了。

self.tool_requires("cmake/[>3.10]") 也服从这个规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网穿透神器-frp的概念,搭建和使用,方便访问内网服务

FRP概念 FRP是什么(借助官网的描述)&#xff1f; frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 为什么是用FR…

【斗破】魔兽山脉回归,彩鳞牵手手萧炎老公,小医仙大战美杜莎

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析【斗破苍穹年番】 斗破苍穹年番动画更新了&#xff0c;云岚宗正式解散&#xff0c;云韵道别&#xff0c;携手纳兰嫣然闯荡中州&#xff0c;而萧炎联合海老&#xff0c;也创立了加玛帝国第一势力炎盟&#xff0c;有了保护萧…

DRM全解析 —— ADD_FB(2)

接前一篇文章&#xff1a;DRM全解析 —— ADD_FB&#xff08;1&#xff09; 本文参考以下博文&#xff1a; DRM驱动&#xff08;四&#xff09;之ADD_FB 特此致谢&#xff01; 上一回围绕libdrm与DRM在Linux内核中的接口&#xff1a; DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, d…

Linux驱动之Linux自带的LED灯驱动

目录 一、简介 二、使能Linux自带LED驱动 三、Linux内核自带LED驱动框架 四、设备树节点编写 五、运行测试 一、简介 前面我们都是自己编写 LED 灯驱动&#xff0c;其实像 LED 灯这样非常基础的设备驱动&#xff0c; Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 …

Qt Creator 创建 Qt 默认窗口程序

Qt 入门实战教程&#xff08;目录&#xff09; Windows Qt 5.12.10下载与安装 使用Qt Creator 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境&#xff0c;也不需要你再在Visual Studio 2022中…

OJ练习第159题——消灭怪物的最大数量

消灭怪物的最大数量 力扣链接&#xff1a;1921. 消灭怪物的最大数量 题目描述 你正在玩一款电子游戏&#xff0c;在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 n 的整数数组 dist &#xff0c;其中 dist[i] 是第 i 个怪物与城市的 初始距离&#…

Web安全——穷举爆破下篇(仅供学习)

Web安全 一、常见的端口服务穷举1、hydra 密码穷举工具的使用2、使用 hydra 穷举 ssh 服务3、使用 hydra 穷举 ftp 服务4、使用 hydra 穷举 mysql 服务5、使用 hydra 穷举 smb 服务6、使用 hydra 穷举 http 服务7、使用 hydra 穷举 pop3 服务8、使用 hydra 穷举 rdp 服务9、使用…

在k8s中使用secret存储敏感数据与四种用法

当需要存储敏感数据时可以使用&#xff0c;secret会以密文的方式存储数据。 创建secret的四种方法 &#xff08;1&#xff09;通过--from-literal #每个--from-literal对应一个信息条目 kubectl create secret generic mysecret --from-literalusernameadmin --from-litera…

五-垃圾收集器G1ZGC详解

回顾CMS垃圾收集器 G1垃圾收集器 G1是一款面向服务器的垃圾收集器&#xff0c;主要针对配备多颗处理器及大容量处理的机器。以及高概率满足GC停顿时间要求的同时&#xff0c;还具备高吞吐量性能特征 物理上没有明显的物理概念&#xff0c;但是逻辑上还是有分代概念 物理上分…

近年GDC服务器分享合集(四): 《火箭联盟》:为免费游玩而进行的扩展

如今&#xff0c;网络游戏采用免费游玩&#xff08;Free to Play&#xff09;加内购的比例要远大于买断制&#xff0c;这是因为前者能带来更低的用户门槛。甚至有游戏为了获取更多的用户&#xff0c;选择把原来的买断制改为免费游玩&#xff0c;一个典型的例子就是最近的网易的…

Pytorch+Yolov3搭建自己的目标检测项目工程(带你从理论到实践)

学习目标 使用pytorch去构建一个Yolov3的项目工程。 参考的原作者的博客&#xff1a;睿智的目标检测26——Pytorch搭建yolo3目标检测平台 构建主干网络darknet53 yolov3采用的主干网络是darknet53&#xff0c;借鉴了yolov2中的网络darknet19结构&#xff0c;相较于后者&…

Win 教程 Win7实现隔空投送

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

深入探讨梯度下降:优化机器学习的关键步骤(二)

文章目录 &#x1f340;引言&#x1f340;eta参数的调节&#x1f340;sklearn中的梯度下降 &#x1f340;引言 承接上篇&#xff0c;这篇主要有两个重点&#xff0c;一个是eta参数的调解&#xff1b;一个是在sklearn中实现梯度下降 在梯度下降算法中&#xff0c;学习率&#xf…

I2C与I3C的对比

I2C与I3C的对比 电气特性 I2C 1.半双工 2.串行数据线(SDA)和串行时钟线(SCL) 3.数据线漏极开路&#xff0c;即I2C接口接上拉电阻 4.I2C总线运行速度&#xff1a;**标准模式100kbit/s&#xff0c;快速模式400kbit/s&#xff0c;快速模式plus 1Mbit/s&#xff0c;**高速模式…

TopSAP天融信 LINUX客户端 CentOS版安装

TopSAP天融信 LINUX客户端 CentOS版安装 下载客户端安装运行 下载客户端 项目需要用到CentOS环境下的天融信客户端&#xff0c;可以下载LINUX版 下载地址 https://app.topsec.com.cn/ X86_64(或AMD64)架构客户端deb包&#xff1a;V3.5.2.36.2 MD5 :EC032529A8D3A645B7368F28E…

Darshan日志分析

标头 darshan-parser 输出的开头显示了有关作业的总体信息的摘要。还可以使用–perf、–file或–total命令行选项生成其他作业级别摘要信息。 darshan log version&#xff1a;Darshan 日志文件的内部版本号。compression method&#xff1a;压缩方法。exe&#xff1a;生成日志…

中文命名实体识别

本文通过people_daily_ner数据集&#xff0c;介绍两段式训练过程&#xff0c;第一阶段是训练下游任务模型&#xff0c;第二阶段是联合训练下游任务模型和预训练模型&#xff0c;来实现中文命名实体识别任务。 一.任务和数据集介绍 1.命名实体识别任务 NER&#xff08;Named En…

开发总结:webpack

webpack官网webpack | webpack 中文文档 | webpack 中文网 一、什么是webpack webpack 可以看做是模块打包机&#xff0c;它所做的事情是&#xff1a;分析你的项目结构&#xff0c;找到JavaScript 模块以及其它的一些浏览器不能直接运行的拓展语言&#xff08;Scss&#xff0…

(位运算) 剑指 Offer 15. 二进制中1的个数 ——【Leetcode每日一题】

❓ 剑指 Offer 15. 二进制中1的个数 难度&#xff1a;简单 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff…

非科班菜鸡算法学习记录 | 代码随想录算法训练营第53天|| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

1143. 最长公共子序列 知识点&#xff1a;动规 状态&#xff1a;不会 思路&#xff1a; 用dpij表示两个串中到i-1和j-1个字符结束的最长公共子序列长度&#xff08;不用特殊初始化&#xff09; class Solution { public:int longestCommonSubsequence(string text1, string …