当前位置: 首页 > news >正文

C/C++包管理工具:Conan

Conan是一个专为C/C++设计的开源、去中心化、跨平台的包管理器,致力于简化依赖管理和二进制分发流程。Conan基于Python进行开发,支持与主流的构建系统集成,提供了强大的跨平台和交叉编译能力。通过Conan,开发者可以高效的创建、共享和使用预编译的二进制包,提升开发效率和协作体验,尤其适合于复杂项目和多环境部署的场景。

下文将结合一个cmake构建系统的C++ Demo工程介绍conan安装、基本概念及简单使用,更多的示例和更复杂的应用需求建议查询Conan用户文档。

Conan用户文档:https://docs.conan.io/2/index.html

一、安装

pipx install conan

验证安装结果:

$ conan -v
Conan version 2.20.0

Conan1.x和Conan2.x不兼容,默认是conan2.x,如果使用Conan1.x可以指定版本安装

pipx install conan==1.66.0

二、概念和配置

1、常用命令(commands)
  • conan config: 管理conan的配置(远程、设置、插件等)
    # 指定目录安装conan配置文件: 
    conan config install <config_path> 
    
  • conan profile: 显示和管理profile文件
    # 查看所有的profile文件
    conan profile list
    
  • conan remove: 移除包从本地缓存或远程
    # 移除指定的包
    conan remove <name>
    # 移除指定版本的包
    conan remove <name>/<version>
    
  • conan version: 查看conan客户端的版本信息
    $ conan version
    version: 2.20.0
    conan_path: /root/.local/bin/conan
    pythonversion: 3.12.3sys_version: 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0]sys_executable: /root/.local/share/pipx/venvs/conan/bin/pythonis_frozen: Falsearchitecture: x86_64
    systemversion: #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025platform: Linux-5.15.0-139-generic-x86_64-with-glibc2.39system: Linuxrelease: 5.15.0-139-genericcpu: x86_64
    
  • conan create: 从一个配方文件创建一个包
    # 当二进制不存在时构建
    conan create <project_path> -pr=<profile_file> --build=missing
    
2、配方文件(conanfile.py)

conanfile.py是一个包的配方,负责定义怎么定义和消费一个包。

from conan import ConanFileclass HelloConan(ConanFile):...

conanfile.py使用了多种属性(attributes)和方法(methods)用于操作。为了避免冲突,请遵循一下规则:

  • 公共属性和方法,像build(),self.package_folder,是conan保留的。不要在配方中使用这些公共成员作为自定义属性或方法。
  • 对你自己的成员使用“protected”访问,像self._my_data或def _my_helper(self):。Conan只保留“_conan”作为保护成员的开始。
(1)属性(attributes)

conanfile.py Attributes文档:https://docs.conan.io/2/reference/conanfile/attributes.html

Attribute说明
name包的名字
version包的版本
description包的描述信息
license包的license信息
author包的作者信息
setting列举第一层的配置信息(来自setting.yml),这些值将被用于计算package id
options定义option的名字及允许的值,默认任何值改变都将影响package id
default_options定义options的默认值
generators描述所需的生成器名字

注:Attribute一般提供简单的功能,对于复杂的需求可以使用功能相似的Method实现。

(2)方法(methods)

conanfile.py Methods文档:https://docs.conan.io/2/reference/conanfile/methods.html

Mathod说明
build()包含了从源码构建包的构建指令
build_requirements()定义了tool_requirestest_requires
configure()允许在计算依赖时进行配置和选择
deploy()从package中复制指定文件到特定目录
generate()生成构建包时所必须的文件
layout()定义工程相关的源文件夹、build文件夹等
package()从build文件夹copy文件到package文件夹
requirements()定义依赖的包
set_name()动态定义包的名字
set_version()动态定义包的版本
system_requirements()调用系统包管理(比如apt)安装系统包
test()运行简单的包测试
(3)Running命令

对于系统命令,Conan提供了self.run()方法,支持在指定环境中运行相应的系统命令,并且当命令执行错误时,支持抛出异常以便错误能够被及时发现。

run(self, command: str, stdout=None, cwd=None, ignore_errors=False, env='', quiet=False, shell=True, scope='build', stderr=None)
  • command – 待运行的命令字符串.
  • stdout – 支持将标准输出重定向,默认输出到标准输出流。
  • stderr – 支持将错误输出重定向,默认输出到标准错误流。
  • cwd – 指定运行命令的工作空间。
  • ignore_errors – 如果为Ture,命令执行错误也将不抛出异常。
  • env – 要使用的环境文件,当scope为build时默认为conanbuild,否则scope为run默认使用conanrun。如果明确设置为None则不会使用任何环境文件。
  • quiet – 如果为True,将屏蔽该命令的输出。
  • shell – 如果为True,将在一个shell中运行该命令。这将会被传递给底层的popen函数。
  • scope – 这个命令的范围,只能是“build”或者“run”。用于指定命令执行时所处的环境作用域。它们决定了命令执行时使用的环境变量集合。(这些环境变量通常在generate()阶段生成并保存在相应脚本中)
(4)从配方输出文本

Conan建议使用self.output代替print()从配方中输出文本信息。self.output下的成员方法有:

error(self, msg:str, error_type:str=None)
warning(self, msg:str, warn_tag:str=None)
info(self, msg:str, fg:str=None, bg:str=None)status(self, msg:str, fg:str=None, bg:str=None)
verbose(self, msg:str, fg:str=None, bg:str=None)
debug(self, msg:str, fg:str='\x1b[35m',bg:str=None)
trace(self, msg:str)success(self, msg:str)
highlight(self, msg:str)
(5)配方工具

配方工具文档:https://docs.conan.io/2/reference/tools.html

配方工具是指能够在conan配方中引用的工具,比如:

from conan.tools.cmake import CMakeToolchain, CMakeDeps, CMake, cmake_layout
from conan.tools.env import Environment, EnvVars, VirtualBuildEnv, VirtualRunEnv
from conan.tools.files import *
from conan.tools.scm import Git, Version
from conan.tools.system import Apt

注:conanfile.py还有一个对功能简单的版本:conanfile.txt,便于对依赖项的简单管理使用,不能用于创建软件包。

3、配置文件
(1)global.conf

global.conf文件位于Conan的家目录,~/.conan2/global.conf。如果不存在将自动创建一个。global.conf文件的目标是存在一些核心(core)、工具(tool)及用户(user)的配置变量,这些变量也将会被Conan使用。

  • core.*:旨在配置 Conan 核心行为的参数(下载重试次数、包标识模式等)。仅能在global.conf文件中进行定义。
  • tool.*: 旨在配置 Conan 工具(工具链、构建辅助程序等)在您的配方中所使用的值。可在global.conf和配置文件中进行定义。
  • user.*: 旨在定义个人用户配置。用户可以自行设定任何所需内容。这些配置可在global.conf文件和配置文件中进行设定。

使用命令conan config list可以查看当前的所有配置。

(2)profiles

Conan配置文件允许用户在文件中为设置、选项、环境变量(包括构建时和运行时环境)以及工具需求和配置变量设定一个完整的配置集。

[settings]
arch=x86_64
build_type=Release
os=Macos[options]
mylib/*:shared=True[tool_requires]
tool1/0.1@user/channel
*: tool4/0.1@user/channel[buildenv]
VAR1=value[runenv]
EnvironmentVar1=My Value[conf]
tools.build:jobs=2[replace_requires]
zlib/1.2.12: zlib/[*][replace_tool_requires]
7zip/*: 7zip/system[platform_requires]
dlib/1.3.22[platform_tool_requires]
cmake/3.24.2

注:对不需要特定设置section,可以不在profile中声明。

(3)settings.yml
# This file was generated by Conan. Remove this comment if you edit this file or Conan
# will destroy your changes.
os:Windows:subsystem: [null, cygwin, msys, msys2, wsl]WindowsStore:version: ["8.1", "10.0"]WindowsCE:platform: [ANY]version: ["5.0", "6.0", "7.0", "8.0"]Linux:iOS:version: &ios_version["7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "8.4", "9.0", "9.1", "9.2", "9.3","10.0", "10.1", "10.2", "10.3","11.0", "11.1", "11.2", "11.3", "11.4","12.0", "12.1", "12.2", "12.3", "12.4", "12.5","13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7","14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", "14.8","15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6", "15.7", "15.8","16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6", "16.7","17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6", "17.8","18.0", "18.1", "18.2", "18.3", "18.4", "18.5", "18.6"]sdk: ["iphoneos", "iphonesimulator"]sdk_version: [null, "11.3", "11.4", "12.0", "12.1", "12.2", "12.4","13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7","14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "15.0", "15.2", "15.4","15.5", "16.0", "16.1", "16.2", "16.4", "17.0", "17.1", "17.2", "17.4", "17.5","18.0", "18.1", "18.2", "18.4", "18.5"]watchOS:version: ["4.0", "4.1", "4.2", "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1", "6.2", "6.3","7.0", "7.1", "7.2", "7.3", "7.4", "7.5", "7.6","8.0", "8.1", "8.3", "8.4", "8.5", "8.6", "8.7","9.0","9.1", "9.2", "9.3", "9.4", "9.5", "9.6","10.0", "10.1", "10.2", "10.3", "10.4", "10.5", "10.6","11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6"]sdk: ["watchos", "watchsimulator"]sdk_version: [null, "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1", "6.2","7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.0.1", "8.3", "8.5", "9.0", "9.1","9.4", "10.0", "10.1", "10.2", "10.4", "10.5","11.0", "11.1", "11.2", "11.4", "11.5"]tvOS:version: ["11.0", "11.1", "11.2", "11.3", "11.4","12.0", "12.1", "12.2", "12.3", "12.4","13.0", "13.2", "13.3", "13.4","14.0", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7","15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6","16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6","17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6","18.0", "18.1", "18.2", "18.3", "18.4", "18.5", "18.6"]sdk: ["appletvos", "appletvsimulator"]sdk_version: [null, "11.3", "11.4", "12.0", "12.1", "12.2", "12.4","13.0", "13.2", "13.3", "13.4", "14.0", "14.2", "14.3", "14.4", "14.5", "15.0","15.2", "15.4", "15.5", "16.0", "16.1", "16.4", "17.0", "17.1", "17.2", "17.4", "17.5","18.0", "18.1", "18.2", "18.4", "18.5"]visionOS:version: ["1.0", "1.1", "1.2", "1.3", "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6"]sdk: ["xros", "xrsimulator"]sdk_version: [null, "1.0", "1.1", "1.2", "1.3", "2.0", "2.1", "2.2", "2.4", "2.5"]Macos:version: [null, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15","11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6", "11.7","12.0", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6", "12.7","13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7","14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7","15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6"]sdk_version: [null, "10.13", "10.14", "10.15", "11.0", "11.1", "11.2", "11.3", "12.0", "12.1","12.3", "12.4", "13.0", "13.1", "13.3", "14.0", "14.2", "14.4", "14.5","15.0", "15.1", "15.2", "15.4", "15.5"]subsystem:null:catalyst:ios_version: *ios_versionAndroid:api_level: [ANY]ndk_version: [null, ANY]FreeBSD:SunOS:AIX:Arduino:board: [ANY]Emscripten:Neutrino:version: ["6.4", "6.5", "6.6", "7.0", "7.1"]baremetal:VxWorks:version: ["7"]
arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64,armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, arm64ec,sparc, sparcv9,mips, mips64, avr, s390, s390x, asm.js, wasm, wasm64, sh4le,e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7,riscv64, riscv32,xtensalx6, xtensalx106, xtensalx7,tc131, tc16, tc161, tc162, tc18]
compiler:sun-cc:version: ["5.10", "5.11", "5.12", "5.13", "5.14", "5.15"]threads: [null, posix]libcxx: [libCstd, libstdcxx, libstlport, libstdc++]gcc:version: ["4.1", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9","5", "5.1", "5.2", "5.3", "5.4", "5.5","6", "6.1", "6.2", "6.3", "6.4", "6.5","7", "7.1", "7.2", "7.3", "7.4", "7.5","8", "8.1", "8.2", "8.3", "8.4", "8.5","9", "9.1", "9.2", "9.3", "9.4", "9.5","10", "10.1", "10.2", "10.3", "10.4", "10.5","11", "11.1", "11.2", "11.3", "11.4", "11.5","12", "12.1", "12.2", "12.3", "12.4", "12.5","13", "13.1", "13.2", "13.3", "13.4","14", "14.1", "14.2", "14.3","15", "15.1", "15.2"]libcxx: [libstdc++, libstdc++11]threads: [null, posix, win32, mcf]  # Windows MinGWexception: [null, dwarf2, sjlj, seh]  # Windows MinGWcppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]msvc:version: [170, 180, 190, 191, 192, 193, 194]update: [null, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]runtime: [static, dynamic]runtime_type: [Debug, Release]cppstd: [null, 14, 17, 20, 23]toolset: [null, v110_xp, v120_xp, v140_xp, v141_xp]cstd: [null, 11, 17]clang:version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "4.0","5.0", "6.0", "7.0", "7.1","8", "9", "10", "11", "12", "13", "14", "15", "16", "17","18", "19", "20", "21"]libcxx: [null, libstdc++, libstdc++11, libc++, c++_shared, c++_static]cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]runtime: [null, static, dynamic]runtime_type: [null, Debug, Release]runtime_version: [null, v140, v141, v142, v143, v144]cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]apple-clang:version: ["5.0", "5.1", "6.0", "6.1", "7.0", "7.3", "8.0", "8.1", "9.0", "9.1","10.0", "11.0", "12.0", "13", "13.0", "13.1", "14", "14.0", "15", "15.0","16", "16.0", "17", "17.0"]libcxx: [libstdc++, libc++]cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]intel-cc:version: ["2021.1", "2021.2", "2021.3", "2021.4", "2022.1", "2022.2","2022.3", "2023.0", "2023.1", "2023.2", "2024.0", "2024.1","2025.0", "2025.1"]update: [null, ANY]mode: ["icx", "classic", "dpcpp"]libcxx: [null, libstdc++, libstdc++11, libc++]cppstd: [null, 98, gnu98, "03", gnu03, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]runtime: [null, static, dynamic]runtime_type: [null, Debug, Release]qcc:version: ["4.4", "5.4", "8.3"]libcxx: [cxx, gpp, cpp, cpp-ne, accp, acpp-ne, ecpp, ecpp-ne]cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17]mcst-lcc:version: ["1.19", "1.20", "1.21", "1.22", "1.23", "1.24", "1.25"]libcxx: [libstdc++, libstdc++11]cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]emcc:# From https://github.com/emscripten-core/emscripten/blob/main/ChangeLog.md# There is no ABI compatibility guarantee between versionsversion: [ANY]libcxx: [null, libstdc++, libstdc++11, libc++]threads: [null, posix, wasm_workers]cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]build_type: [null, Debug, Release, RelWithDebInfo, MinSizeRel]

通过settings.yml文件,设置的可能值都在同一个文件中定义。这样做是为了确保名称和拼写的一致性,并在用户和开源软件社区之间建立一个统一的设置模型。
对于设置的一些特殊信息:

  • 如果某个设置允许设置为任意值,那么就可以使用“ANY”这个选项。
  • 如果某个设置允许设置为任意值,或者也可以不进行设置,那么您可以使用 [null, ANY] 这种组合。
    这个配置文件可以根据任何需求进行修改,包括添加新的设置或子设置及其值。如果希望使用工程中的settings.yml文件,可以使用conan config install命令将指定的setting.yml文件安装(覆盖)到Conan家目录。
4、环境变量

可用于配置 Conan 某些行为的环境变量非常少。这些环境变量属于例外情况,对于自定义和配置控制,Conan使用global.conf配置以及profile文件的[conf]部分。

环境变量说明
CONAN_HOME控制Conan的家目录,默认没有定义,使用~/.conan2
CONAN_DEFAULT_PROFILE指定一个不同于“default”的默认profile名
5、二进制模型

二进制模型是Conan包管理的核心。它通过对profile配置(setting + options + dependencies versions)进行哈希运算获取package_id,确定了包的唯一性。
而profile中,各配置项保证了C/C++ API接口的兼容性,ABI接口的兼容性,从而实现对二进制文件的管理和分发。
另外Conan二进制模型具有可扩展性,用户可以定义自定义设置、选项和配置,以塑造其自身二进制文件的特性。

在这里插入图片描述
在这里插入图片描述

三、一个完整的工程demo

1、创建cmake工程
(1)创建工程
  • C++源文件
// source/main.cpp
#include <iostream>
#include <cstdint>std::int32_t main(void)
{std::cout << "Hello World!" << std::endl;return 0;
}
  • C++测试文件
// test/main.cpp
#include <gtest/gtest.h>TEST(ExampleTest, StringTest) {std::string str = "Hello";EXPECT_EQ(str, "Hello");EXPECT_NE(str, "World");
}int main(int argc, char **argv) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
  • cmake文件
# CMakeLists.txt
cmake_minimum_required(VERSION 3.28)project(ConanDemo VERSION 1.0.0 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME}PRIVATEsource/main.cpp
)set_target_properties(${PROJECT_NAME}PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)find_package(GTest)add_executable(${PROJECT_NAME}_test)
target_sources(${PROJECT_NAME}_testPRIVATEtest/main.cpp
)target_link_libraries(${PROJECT_NAME}_testPRIVATEGTest::gtest_main
)set_target_properties(${PROJECT_NAME}_testPROPERTIESRUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)enable_testing()
add_test(NAME ${PROJECT_NAME}_testCOMMAND ${PROJECT_NAME}_test
)
  • 当前工程结构
$ tree
.
|-- CMakeLists.txt
|-- source
|   `-- main.cpp
`-- test`-- main.cpp
(2)基于cmake构建验证
# 配置cmake
cmake -S . -B build
# 构建目标
cmake --build build
# 运行test
cmake --build build --target test
2、添加conan管理
(1)设计conan配置文件
  • setting.yml文件
os:Linux:platform: [null, host, pi4]
arch: [x86_64, armv7, armv7hf, armv8, armv8_32, riscv64, riscv32]
compiler:gcc:version: ["4.1", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9","5", "5.1", "5.2", "5.3", "5.4", "5.5","6", "6.1", "6.2", "6.3", "6.4", "6.5","7", "7.1", "7.2", "7.3", "7.4", "7.5","8", "8.1", "8.2", "8.3", "8.4", "8.5","9", "9.1", "9.2", "9.3", "9.4", "9.5","10", "10.1", "10.2", "10.3", "10.4", "10.5","11", "11.1", "11.2", "11.3", "11.4", "11.5","12", "12.1", "12.2", "12.3", "12.4", "12.5","13", "13.1", "13.2", "13.3", "13.4","14", "14.1", "14.2", "14.3","15", "15.1", "15.2"]libcxx: [libstdc++, libstdc++11]threads: [null, posix, win32, mcf]  # Windows MinGWexception: [null, dwarf2, sjlj, seh]  # Windows MinGWcppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]clang:version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "4.0","5.0", "6.0", "7.0", "7.1","8", "9", "10", "11", "12", "13", "14", "15", "16", "17","18", "19", "20", "21"]libcxx: [null, libstdc++, libstdc++11, libc++, c++_shared, c++_static]cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]runtime: [null, static, dynamic]runtime_type: [null, Debug, Release]runtime_version: [null, v140, v141, v142, v143, v144]cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]build_type: [null, Debug, Release, RelWithDebInfo]
  • profile文件
# host_x86_64
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu17
compiler.libcxx=libstdc++11
compiler.version=13
os=Linux
os.platform=host
# pi4_aarch64
[settings]
arch=armv8
build_type=Release
compiler=gcc
compiler.cppstd=gnu17
compiler.libcxx=libstdc++11
compiler.version=13
os=Linux
os.platform=pi4
(2)添加conanfile.py文件
# conanfile.py
from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDepsclass ConanDemo(ConanFile):name = "hello"version = "1.0"# Optional metadatalicense = "<Put the package license here>"author = "<Put your name here> <And your email here>"url = "<Package recipe repository url here, for issues about the package>"description = "<Description of hello package here>"topics = ("<Put some tag here>", "<here>", "<and here>")# Binary configurationsettings = "os", "compiler", "build_type", "arch"options = {"shared": [True, False], "fPIC": [True, False]}default_options = {"shared": False, "fPIC": True}# Sources are located in the same place as this recipe, copy them to the recipeexports_sources = "CMakeLists.txt", "source/*", "test/*"def config_options(self):passdef layout(self):cmake_layout(self)def generate(self):deps = CMakeDeps(self)deps.generate()tc = CMakeToolchain(self)tc.generate()def build(self):cmake = CMake(self)cmake.configure()cmake.build()def package(self):cmake = CMake(self)cmake.install()def package_info(self):self.cpp_info.libs = ["hello"]
(3)安装配置文件
  • 当前的工程结构
$ tree
.
|-- CMakeLists.txt
|-- conan
|   |-- profiles
|   |   |-- host_x86_64
|   |   `-- pi4_aarch64
|   `-- settings.yml
|-- conanfile.py
|-- source
|   `-- main.cpp
`-- test`-- main.cpp
  • 安装Conan配置
# 创建默认的profile
conan profile detect
# 安装指定的conan配置
conan config install conan

注:conan config install conan会将conan文件下的所有文件复制到Conan的家目录。

  • 检查安装的profile
$ conan profile list
Profiles found in the cache:
default
host_x86_64
pi4_aarch64
(4)基于conan创建包
  • 执行命令
# 清除已有构建
conan remove hello# 使用默认的profile创建包
conan create . 
# 使用host_x86_64创建包
conan create . -pr=host_x86_64
# 使用pi4_aarch64创建包
conan create . -pr=pi4_aarch64
  • 检查conan包
$ tree ~/.conan2/p -L 2
/root/.conan2/p
|-- b
|   |-- hello97f3ea6988f96
|   |-- hello9cf30133a2f6d
|   `-- hellob394c1d27f95b
|-- cache.sqlite3
|-- hello066c562205912
|   |-- d
|   |-- e
|   |-- es
|   `-- s
`-- t

conan cache中还是包含挺多文件:工程的源码文件、conan的生成文件、构建后的输出文件等,可以在自己本地搭建环境运行后自行查看。


文章转载自:

http://nuxZULL2.rbgwj.cn
http://H5lpKBvv.rbgwj.cn
http://BdFmKZjh.rbgwj.cn
http://MJk4pk0m.rbgwj.cn
http://87ey1R2s.rbgwj.cn
http://LzgnfOgb.rbgwj.cn
http://7x5zNmM5.rbgwj.cn
http://DRhc5cIu.rbgwj.cn
http://xFJw5I9i.rbgwj.cn
http://agEnTwnf.rbgwj.cn
http://DCyzkQL5.rbgwj.cn
http://iR7GpKMA.rbgwj.cn
http://T0knGpTK.rbgwj.cn
http://F2mJ0L02.rbgwj.cn
http://1CBP3bZ2.rbgwj.cn
http://P6p1M77H.rbgwj.cn
http://72d4RJRn.rbgwj.cn
http://tNqMuTP3.rbgwj.cn
http://v0i6ZJ2F.rbgwj.cn
http://o1jEqzKn.rbgwj.cn
http://IjSjvGij.rbgwj.cn
http://Lkgwhg55.rbgwj.cn
http://BEUNlI4h.rbgwj.cn
http://doMSjOxm.rbgwj.cn
http://Y8r0b3jD.rbgwj.cn
http://McVqS49x.rbgwj.cn
http://u3rTv2Zk.rbgwj.cn
http://sonVXihd.rbgwj.cn
http://O3x2ITdT.rbgwj.cn
http://1uhkaYML.rbgwj.cn
http://www.dtcms.com/a/369690.html

相关文章:

  • 标注格式转换csv转xml
  • 错误是ModuleNotFoundError: No module named ‘pip‘解决“找不到 pip”
  • 文章采集发布帝国ECMS网站技巧
  • 创新、绿色、共赢:芬兰企业在华发展战略与案例解析(2025中芬建交75周年)
  • PAIN | 痛在你身,激活在我脑:原来后侧默认模式网络是‘感同身受’的神经开关
  • 【C++】Vector完全指南:动态数组高效使用
  • 状压 dp --- TSP 问题
  • 【数字孪生核心技术】什么是倾斜摄影?
  • 公共卫浴感应开关选红外还是雷达
  • 解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题
  • 计算机二级C语言操作题(填空、修改、设计题)——真题库(17)附解析答案
  • 上位机通信基础知识
  • Acrobat-2025.001.20643_Win中文_PDF编辑器_便携版安装教程
  • Java基础 9.5
  • javafx笔记
  • 大基座模型与 Scaling Law:AI 时代的逻辑与困境
  • 扩展与改进的密钥协商协议
  • Spring整合MQTT使用
  • AI应用开发-技术架构 PAFR介绍
  • 9月5日星期五今日早报简报微语报早读
  • Zynq-7000 上 RT-Thread 的 MMU 与 SMP 优势分析
  • 【完整源码+数据集+部署教程】西兰花实例分割系统源码和数据集:改进yolo11-AggregatedAtt
  • 数据库查询优化
  • PiscCode基于 Mediapipe 实现轨迹跟踪
  • 硬件(三) 通信方式、串口通信
  • 在 CentOS 上完整安装 Docker 指南
  • 详解人造卫星遭遇的地球反射光与月球反射光
  • NAF、INRAS、NACF论文解读
  • 【Linux】系统部分——进程间通信1(管道)
  • 从策略到实效|Adobe Target 实战应用与成功案例