讲师中心 微信公众号
AI工具推荐 视频效率加速

c++项目中如何通过Conan管理二进制依赖? (对比vcpkg)

大浩大大_1921

大浩大大_1921

发布时间:2026-01-19 10:01:48

|

590人浏览过

|

来源于php中文网

原创

Conan按项目隔离管理二进制包,核心流程为conan install生成CMake配置、conan create打包库、conan upload推送至远程;推荐使用CMakeDeps/CMakeToolchain生成器,需在CMakeLists.txt中include并find_package链接。

c++项目中如何通过conan管理二进制依赖? (对比vcpkg)

Conan 的基本工作流:从声明依赖到链接库

Conan 不是全局安装所有依赖,而是按项目隔离管理二进制包。核心动作是三步:conan install 生成构建配置(如 conanbuildinfo.cmake),conan create 打包自己的库,conan upload 推送到私有或公共远程仓库。

典型 conanfile.txt 声明如下:

[requires]
fmt/10.2.1
openssl/3.2.1

[generators]
CMakeDeps
CMakeToolchain

注意:CMakeDeps 和 CMakeToolchain 是 Conan 2.x 推荐的生成器,替代旧版 cmake_find_package;它们与 CMake 3.23+ 原生兼容,避免 find_package() 查找失败。

  • 运行 conan install . --build=missing --settings compiler.cppstd=17 会自动下载、构建缺失的二进制(若远程无匹配)
  • 生成的 build/generators/ 下文件需在 CMakeLists.txt 中 include(),再用 find_package(fmt CONFIG) 链接
  • Conan 默认按 profile(如 default)解析平台、编译器、标准等设置,不同项目可共用同一 profile,也可用 --profile:build / --profile:host 分离构建机与目标机环境

vcpkg 与 Conan 的关键差异点:二进制复用粒度和 ABI 控制

vcpkg 默认按 triplet(如 x64-windows-static-md)构建,所有依赖强制统一静态/动态、CRT 类型、链接方式;Conan 则允许每个依赖独立指定 shared=True/False、fPIC=True 等选项,并通过 settings(如 compiler.version)和 options 构成唯一二进制 ID。

立即学习“C++免费学习笔记(深入)”;

Expanso json-flatten
Expanso json-flatten

通过 CLI 或 MCP 服务器,使用 Expanso Edge 管道扁平化嵌套 JSON 对象。

下载

这意味着:

  • vcpkg 的二进制复用更“粗”,一个 triplet 下所有包必须一致;Conan 可混合 zlib/1.2.13 动态链接 + boost/1.83.0 静态链接,只要 ABI 兼容
  • vcpkg 没有原生 profile 概念,跨平台需手动维护多个 triplet 文件;Conan 的 profiles 支持继承、条件覆盖(如 [settings] os=Linux arch=x86_64 compiler=gcc compiler.version=12)
  • vcpkg 的 vcpkg.json 不支持版本范围(如 ^1.2.0),Conan 的 conanfile.py 可用 self.requires("fmt/[>=10.0.0 精确约束

Conan 2.x 中容易踩的坑:缓存污染、远程优先级、CMake 集成断裂

Conan 缓存(~/.conan2)不是“干净即安全”。常见问题包括:

  • 本地修改过某个依赖的 conanfile.py 并 conan create 后,未清理缓存就切分支,导致旧二进制被复用 —— 应用 conan remove "zlib/*" -c 清除特定引用
  • 多个远程(如 conancenter、私有 Artifactory)存在同名同版本包时,Conan 按 conan remote list 顺序查找,第一个命中即停;误配顺序会导致拉取错误源码 —— 用 conan remote update <name> --force</name> 调整优先级
  • CMakeLists.txt 中若仍用 find_package(OpenSSL) 而非 find_package(OpenSSL CONFIG),且未 include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake),则头文件路径、宏定义、链接库全丢失

何时该选 Conan 而非 vcpkg?看这三点硬指标

如果你的项目需要:

  • 跨平台构建中,Windows 使用 MSVC 动态 CRT、Linux 使用 GCC 12 + libstdc++11、macOS 使用 Clang + libc++,且各平台依赖的共享/静态链接策略不一致 → Conan 的 settings/options 组合能力不可替代
  • 团队已有内部 Artifactory/Nexus,要求所有二进制审计可追溯、带签名、按 Git Tag 自动触发 CI 构建 → Conan 的 conan upload --recipe --sources 和 conan lock 锁定完整依赖图,vcpkg 无等效机制
  • 嵌入式目标(如 aarch64-unknown-elf)需自定义 toolchain + 编译器路径,且依赖必须全部静态链接 → Conan 支持 profile 中写死 tools.build:compiler_executable=/opt/arm-gcc/bin/gcc,vcpkg triplet 不支持任意路径注入

Conan 的复杂性主要来自其灵活性 —— 它不预设“标准环境”,所有行为都靠显式声明驱动。一旦 profile、lockfile、generator 三者对齐,CI 构建的可重复性远高于 vcpkg。但这也意味着,少写一行 compiler.cppstd=17,就可能在 CI 上触发全套源码编译。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2235

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3562

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1196

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4099

2025.09.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.12.07

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3359

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2918

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1528

2023.08.01

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn