工具学习_CONAN_Consuming Packages

news2024/11/24 17:26:55

1. Build a simple CMake project using Conan

首先创建一个使用最流行的 C++ 库之一 Zlib 的字符串压缩器应用程序,教程将使用 CMake 构建系统,但需要注意 Conan 适用于任何系统构建方式。 为了完成教程,首先下载对应的项目:

git clone https://github.com/conan-io/examples2.git
cd examples2/tutorial/consuming_packages/simple_cmake_project

教程从一个非常简单的C语言项目开始,其结构如下:

.
├── CMakeLists.txt
└── src
    └── main.c

项目包含一个基本的 CMakeLists.txt(包括 zlib 依赖项)与 main.c(字符串程序源码),main.c 代码如下所示:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <zlib.h>

int main(void) {
    char buffer_in [256] = {"Conan is a MIT-licensed, Open Source package manager for C and C++ development "
                            "for C and C++ development, allowing development teams to easily and efficiently "
                            "manage their packages and dependencies across platforms and build systems."};
    char buffer_out [256] = {0};

    z_stream defstream;
    defstream.zalloc = Z_NULL;
    defstream.zfree = Z_NULL;
    defstream.opaque = Z_NULL;
    defstream.avail_in = (uInt) strlen(buffer_in);
    defstream.next_in = (Bytef *) buffer_in;
    defstream.avail_out = (uInt) sizeof(buffer_out);
    defstream.next_out = (Bytef *) buffer_out;

    deflateInit(&defstream, Z_BEST_COMPRESSION);
    deflate(&defstream, Z_FINISH);
    deflateEnd(&defstream);

    printf("Uncompressed size is: %lu\n", strlen(buffer_in));
    printf("Compressed size is: %lu\n", strlen(buffer_out));

    printf("ZLIB VERSION: %s\n", zlibVersion());

    return EXIT_SUCCESS;
}

CMakeLists.txt 代码如下所示:

cmake_minimum_required(VERSION 3.15)
project(compressor C)

find_package(ZLIB REQUIRED)

add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

项目的应用程序依赖于 Zlib 库,Conan 会尝试从远程服务器安装对应的库。安装 Zlib 库并从项目中找到它的最简单方法是使用 conan.txt 文件,文件内容如下所示:

# 声明使用的库
[requires]
zlib/1.2.11

# 指定生成器
[generators]
CMakeDeps
CMakeToolchain

除了 connfile.txt,项目还需要一个 Conan 配置文件来构建项目。Conan 配置文件允许用户为编译器、构建配置、架构、共享或静态库等定义配置集。默认情况下,Conan 不会尝试自动检测配置文件,因此需要创建一个。为了让 Conan 根据当前的操作系统和安装的工具猜测配置文件,需要运行下面的代码:

conan profile detect --force

这将根据环境检测操作系统、构建架构和编译器设置。默认情况下,它还将构建配置设置为Release。生成的配置文件将以默认名称存储在Conan主文件夹中,默认情况下Conan将在所有命令中使用该配置文件,除非通过命令行指定了另一个配置文件。

项目将使用 Conan 安装 Zlib 并生成 CMake 查找此库和构建项目所需的文件。为了在 build 文件夹中生成这些文件需要运行下面的代码:

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

从输出中可以发现:(1)Conan 从远程服务器下载了 Zlib 库,此服务器存储 Conan recipes 和可重用的二进制文件,因此不需要每次都从源代码构建;(2)Conan 再 build 文件夹下生成了几个文件,这些文件是由 conanfile.txt 中设置的 CMakeToolchain 和 CMakeDeps 生成的。

完成应用程序 TPL 的安装后,可以对应用程序进行构建和运行,对于 Linux 构建和运行代码如下所示:

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

执行 compressor 可得到下面的结果:

2. Using build tools as Conan packages

上一个示例构建了一个 CMake 项目,并使用Conan 安装和定位 Zlib 库。上一个示例使用已经安装在系统中的 CMake 来构建项目,本示例将通过特定版本的 CMake 来构建项目。在这种情况下,Conan 可以是哟个名为 tool_requires 的需求类型声明此依赖关系,下面将通过本示例进行说明该用法。

首先创建一个使用最流行的 C++ 库之一 Zlib 的字符串压缩器应用程序,教程将使用 CMake 构建系统,但需要注意 Conan 适用于任何系统构建方式。 为了完成教程,首先下载对应的项目:

git clone https://github.com/conan-io/examples2.git
cd examples2/tutorial/consuming_packages/tool_requires

教程从一个非常简单的C语言项目开始,其结构如下:

.
├── CMakeLists.txt
└── src
    └── main.c

该示例与上一个示例的主要区别在于 conanfile.txt 文件中添加了 [tool_requires] 部分,该文件内容如下所示:

[requires]
zlib/1.2.11

[tool_requires]
cmake/3.22.6

[generators]
CMakeDeps
CMakeToolchain

该实例在 CMakeLists.txt 中添加一条消息,以输出 CMake 版本,该文件内容如下所示:

cmake_minimum_required(VERSION 3.15)
project(compressor C)

find_package(ZLIB REQUIRED)

message("Building with CMake version: ${CMAKE_VERSION}")

add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

与上一个示例类似,本示例将使用 Conan 安装 Zlib 和 CMake 3.22.6,并生成可执行文件,这一步需要执行的代码如下:

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

通过上述指令, Conan 成功生成一个名为 conanbuild.sh/bat 的新文件,该文件为 conan.txt 中声明 tool_requires 时自动调用 VirtualBuildEnv 生成器的结果。此文件设置了一些环境变量,例如一个新的PATH。为了使用特定版本的 CMake,需要执行下面的代码:

cd build
source conanbuild.sh

执行上述指令后,检查 CMake 版本如下图所示:

可以发现,在激活环境后,CMake v3.22.6 二进制文件夹被添加到路径中,现在是当前活动的版本。这时可以直接通过这个版本的 CMake 来构建项目,需要执行的指令如下所示:

cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build .

如果需要恢复到默认的 CMake 版本,需要执行 build 目录下的 deactivate_conanbuild.sh/bat 脚本,需要执行的代码如下所示:

source deactivate_conanbuild.sh

执行上述指令后,检查 CMake 版本如下图所示:

3. Building for multiple configurations: Release, Debug, Static and Shared

首先创建一个使用最流行的 C++ 库之一 Zlib 的字符串压缩器应用程序,教程将使用 CMake 构建系统,但需要注意 Conan 适用于任何系统构建方式。 为了完成教程,首先下载对应的项目:

git clone https://github.com/conan-io/examples2.git
cd examples2/tutorial/consuming_packages/different_configurations

之前的示例介绍了如何构建一个依赖于 zlib 库的简单 CMake 项目,并了解了 tool_requires。这两个示例都没有指定要在发布或调试模式下构建应用程序,也没有指定是否要静态链接或共享库。如果没有另行指示,Conan 将使用默认配置文件中声明的默认配置。可以通过指令 "conan config home" 定位 Conan 用户主页:

 Conan 主页中的 profile 目录下的 default 文件如下所示:

[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++11
compiler.version=7
os=Linux

其中,setting 部分包含有关操作系统、体系结构、编译器以及构建配置等信息。当调用设置-- profile 参数的 Conan 命令时,Conan 将从配置文件中获取所有信息,并将其应用于要构建或安装的包。如果不指定该参数,则相当于使用--profile=default调用它,即下面两个命令的效果是相同的:

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

可以存储不同的配置文件,并使用它们为不同的设置进行构建,首先要创建对应的配置文件,其内容如下所示:

[settings]
arch=x86_64
build_type=Debug
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++11
compiler.version=7
os=Linux

修改上述文件之后,可以通过下面的指令来安装应用程序的依赖:

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

这时可以直接通过这个版本的 CMake 来构建项目,需要执行的指令如下所示:

cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug
cmake --build .

到目前位置,示例一直在应用程序中静态链接 zlib。可以通过使用 --option 参数将共享选项设置为 true,如下所示:

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

通过上述代码,Conan 将安装 zlib 共享库,生成使用它们构建的文件,以及在运行应用程序时定位的这些动态库所需的文件。这时可以直接通过这个版本的 CMake 来构建项目,需要执行的指令如下所示:

cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug
cmake --build .

在运行可执行文件之前需要首先运行下面的脚本:

source conanrun.sh

运行可执行文件之后需要运行下面的脚本:

source deactivate_conanrun.sh

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

之前的示例通过 conanfile.txt 来声明依赖关系。对于更复杂的依赖关系,可以通过 conanfile.py 来声明依赖关系,本实例将介绍如何完成这一的依赖声明。

首先创建一个使用最流行的 C++ 库之一 Zlib 的字符串压缩器应用程序,教程将使用 CMake 构建系统,但需要注意 Conan 适用于任何系统构建方式。 为了完成教程,首先下载对应的项目:

git clone https://github.com/conan-io/examples2.git
cd examples2/tutorial/consuming_packages/conanfile_py

教程从一个非常简单的C语言项目开始,其结构如下:

.
├── CMakeLists.txt
├── conanfile.py
└── src
    └── main.c

与 conanfile.txt 等价的 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.11")

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

这时可以直接通过这个版本的 CMake 来构建项目,需要执行的指令如下所示:

conan install . --output-folder=build --build=missing
cd build
source conanbuild.sh
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build .

conanfile.py 除了可以完成 conan.txt 可以完成的任务,还能进一步实现项目结构的定义。

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

首先创建一个使用最流行的 C++ 库之一 Zlib 的字符串压缩器应用程序,教程将使用 CMake 构建系统,但需要注意 Conan 适用于任何系统构建方式。 为了完成教程,首先下载对应的项目:

git clone https://github.com/conan-io/examples2.git
cd examples2/tutorial/consuming_packages/cross_building

Conan 可以使用两个不同的配置文件构建应用于不同普通的应用程序,例如,一个应用于 Ubuntu Linux,另一个应用于 Raspberry Pi。为了实现上述目的,需要准备两个 profiles 。

# default
[settings]
os=Linux
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++11
compiler.version=9
# raspberry
[settings]
os=Linux
arch=armv7hf
compiler=gcc
build_type=Release
compiler.cppstd=gnu14
compiler.libcxx=libstdc++11
compiler.version=9
[buildenv]
CC=arm-linux-gnueabihf-gcc
CXX=arm-linux-gnueabihf-g++
LD=arm-linux-gnueabihf-ld

之后需要 修改conanfile.py,如下所示:

from conan import ConanFile
from conan.tools.cmake import cmake_layout

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):
        cmake_layout(self)

除此之外,为了实现 ARM 应用程序的顺利构建,需要在 Ubuntu 机器上安装 arm-linux-gnueabihf 工具链。

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc --version

至此可以进行应用程序的构建,首先使用构建平台和主机平台的配置文件调用 conan install。这将安装为 armv7hf 架构构建的 zlib/1.2.11 依赖项和为 64 位架构运行的 cmake/3.22.6 版本。指令如下所示:

conan install . --build missing -pr:b=default -pr:h=./profiles/raspberry

这时可以直接通过这个版本的 CMake 来构建项目,需要执行的指令如下所示:

cd build
source Release/generators/conanbuild.sh
cmake .. -DCMAKE_TOOLCHAIN_FILE=Release/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build .

最后通过 file 对生成的应用程序进行检查,如下图所示:

6. Introduction to versioning

之前的示例一直在使用带有固定版本的依赖,例如,requires="zlib/1.2.12"。但有时依赖关系会演变,新版本会发布,消费者希望尽可能容易地更新到这些新版本。始终可以编辑connfiles并明确地将版本更新为新版本,但Conan中有机制允许在不修改配方的情况下进行此类更新。

首先创建一个使用最流行的 C++ 库之一 Zlib 的字符串压缩器应用程序,教程将使用 CMake 构建系统,但需要注意 Conan 适用于任何系统构建方式。 为了完成教程,首先下载对应的项目:

git clone https://github.com/conan-io/examples2.git
cd examples2/tutorial/consuming_packages/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" 版本附近,该配置对应 zlib/1.2.8、zlib/1.211 等,但不会对应 zlib/1.3.0。如果执行 conan install 会出现:

如果将对应的设置更改为 zlib/[>1.2.12] 并执行 conan install 则会出现:

同样的思想也可以应用在 tool_requires。

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

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

相关文章

大学生助学贷款

大学生助学贷款 文章目录 大学生助学贷款生源地贷款1. 网上申请2. 线下申请 生源地贷款 助学贷款分为生源地贷款和高校助学贷款, 一般情况下都是申请的生源地贷款.第一次贷款, 需要现在网上申请, 申请结束之后, 会有两张表, 贷款申请表和困难认定申请表.注意: 贷款申请表和困难…

pdf转图片要怎么转?6个软件帮助你轻松转换图片格式

pdf转图片要怎么转&#xff1f;6个软件帮助你轻松转换图片格式 将PDF文件转换为图片格式是许多用户的常见需求&#xff0c;尤其是在需要展示、编辑或分享PDF内容时。以下是六款能够帮助你快速、轻松地将PDF转换为图片格式的软件&#xff1a; 迅捷PDF转换器 这是一款非常简单好…

Redis01——Redis简介

目录 NOSQL与SQL的差异 数据结构&#xff1a;结构化 VS 非结构化 数据关联&#xff1a;关系型 VS 非关系型 数据查询&#xff1a;SQL查询 VS 非SQL查询 事务特性&#xff1a;满足事 VS 没有完全满足 Redis 简介 Redis 安装 Redis 数据结构简介 Redis 常用命令&#xff…

论文被Turnitin查出AI率,会受影响吗?

无论是作业或是毕业论文的提交&#xff0c;原创性已成为了硬性标准。因此提交前都会使用Turnitin&#xff08;www.checktoo.com&#xff09;进行论文检测&#xff0c;用来确保其原创性。可当Turnitin报告能显示出论文的AI率时&#xff0c;越来越多学者开始担忧“这会对我的论文…

c++单例实践

C单例实践 在日常开发中&#xff0c;虽然太多的单例调用会让代码的耦合度变高&#xff0c;但是例如日志类这种&#xff0c;单例模式就变得非常有。所以这篇文章为大家介绍static 关键字相关知识以及如何实现自己的C单例类。 static关键字 首先让我们请出今天的主角: static。…

Brave浏览器:开启隐私保护新时代

今天电脑天空要向大家介绍一款专注隐私安全的浏览器——BraveBrowser&#xff0c;它不仅仅是一个浏览工具&#xff0c;更是你在线隐私的守护者&#xff01; BraveBrowser是一款免费且开源的网络浏览器&#xff0c;它的核心优势在于其强大的广告和跟踪器阻止功能。想象一下&…

数据要素流通交易的场景概述

00前言 数据要素作为国家重点发展方向&#xff0c;如何发挥其数据要素价值是目前研究的重点。核心的观点是流动的数据才能产生价值&#xff0c;如果数据并没有开放、共享那么价值一定是有限的。目前&#xff0c;数据流通类型主要包括数据开放、数据共享和数据交易三种。 数据…

【Python学习手册(第四版)】学习笔记16-函数基础

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍Python中函数的基本概念&#xff0c;作用域以及参数传递&#xff0c;函数语法以及def和return语句的操作&#xff0c;函数调用表达式的行为&#xff…

AWS DMS遇到 Error : no handler found for uri

问题描述&#xff1a; 当我按照文档[1]配置AWS DMS 目标端为OpenSearch, 并进行数据迁移的时候&#xff0c;我遇到了如下报错&#xff1a; 00015696: 2024-07-31T03:26:57 [TARGET_LOAD ]E: Elasticsearch:FAILED SourceTable:test TargetIndex:test Operation:INSERT_E…

Mysql80主从复制搭建;遇到问题 Slave_IO_Running: Connecting和Slave_SQL_Running以及解决过程

总结主要步骤 1.配置一个提供复制的账号&#xff1b; 创建用户 CREATE USER replication% IDENTIFIED BY your_password; GRANT REPLICATION SLAVE ON *.* TO replication%; FLUSH PRIVILEGES;2.修改配置 选择模式 主库配置&#xff1b; windows的得话是my.ini文件 默认这个目…

Vue项目学习(1)

1、进入cmd命令行——> vue ui ——>等等操作 2、 3、src目录下 4、vue项目的启动 &#xff08;1&#xff09; &#xff08;2&#xff09; 5、如何更改前端vue项目的端口号&#xff1f;——>去vue.config.js里配置应一个对象

云端医疗解决方案:互联网医院系统的云计算架构与实现

随着云计算技术的成熟和普及&#xff0c;医疗行业开始探索云端解决方案&#xff0c;以应对数据存储、计算能力和系统扩展性等方面的挑战。互联网医院系统作为医疗信息化的重要组成部分&#xff0c;通过云计算架构实现了高效、灵活和可扩展的医疗服务。本文将深入探讨互联网医院…

【vulnhub】DC-2靶机

信息收集 靶机扫描 nmap 192.168.93.1/24 端口扫描 网页访问 发现访问不到&#xff0c;根据显示考虑IP未遵循重定向到域名 在本机的C:\Windows\System32\drivers\etc 修改hosts⽂件&#xff0c;添加192.168.93.136 dc-2 再次进行访问&#xff0c;可以访问到 点击flag&#x…

牛客JS题(十七)总成绩排名

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 引用传值深拷贝合理封装 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"utf-8" /></head><body><script type"text/javascript&quo…

ResNet原理

一、ResNet基础架构 残差块 批量归一化层 二、ResNet网络参数详解 三、ResNet总结 残差网络的出现使人们摆脱了深度的束缚&#xff0c;大幅改善了深度神经网络中的模型退化问题&#xff0c;使网络层数从数十层跃升至几百上千层&#xff0c;大幅提高了模型精度&#xff0c;通用…

Linux 下 perf 的使用

目录 一、概述1、perf 作用2、常用的工具集 二、perf 工具的使用1、perf list2、perf stat3、perf top4、perf record/report4.1 perf record4.2 perf report 5、perf annotate 一、概述 1、perf 作用 perf 是一个性能分析工具&#xff08;基于 Linux 内核提供的性能事件 per…

jacodb导入带签名的jar包失败的问题

今天在执行某个项目分析时&#xff0c;100多个jar包只有BC库的三个jar包导入失败。错误如下&#xff1a; [DefaultDispatcher-worker-1 coroutine#1] INFO org.jacodb.impl.storage.PersistenceService - Starting app version [1.4] [DefaultDispatcher-worker-16 coroutine#…

世界上最小,装机量最多的数据库居然是...

最近在根客户沟通数据库选型的时候&#xff0c;聊到了手机应用内置的数据库SQLite。别小看它哈&#xff0c;它可是世界上最小&#xff0c;装机量最多的数据库&#xff0c;只是因为它着实太低调了&#xff0c;低调的连官网都是那么朴素。麻雀虽小&#xff0c;五脏俱全&#xff0…

还在人工代码review?reviewdog和PMD了解一下

前言 代码reivew作为团队协同开发时确保代码质量的手段之一&#xff0c;在软件开发团队中非常常见。特别是对于刚入门不久的团队成员&#xff0c;通过代码review也可一定程度上避免一些低级错误&#xff0c;提升整个部分的代码健壮性。 一般来讲&#xff0c;通过代码review可…

LearnOpenGL-入门章节学习笔记

LearnOpenGL-入门章节学习笔记 简介一、核心模式与立即渲染模式二、扩展三、状态机四、对象 创建窗口一、Main函数——实例化窗口二、Callback Function 回调函数三、processInput 函数 创建三角形一、顶点输入二、顶点着色器三、编译着色器四、片段着色器五、着色器程序六、链…