conan 入门(三十三):requirements()指定header的可见性(transitive_headers)

news2024/10/6 10:42:06

package_type

从conan 2.x开始conafile.py增加了一个字段package_type,用于定义当前package的类型,
在这里插入图片描述
参见 package-type

如果我们在写conanfile.py时不指定这个成员,则它默认为library

Requirement traits

不同的包类型定义默认定义不同的需求特性(Requirement traits),如下:
在这里插入图片描述

参见《package_type trait inferring》
关于 headers,libs,run,visible,transitive_headers,transitive_libs特性的说明参见《requirements()》

requirements()

conan 允许在conanfile.py的requirements()方法中手工指定依赖包的特性。

示例

一般来说,只要正确定义了package_type,每个包类型提供的默认需求特性(Requirement traits)是满足大多数使用场景的。
不过conan包的头文件可见性只能传递一代,即只能传递直接引用包的项目,不能跨代传递。所以如果需要跨代传递,就要通过requirements()方法来指定transitive_headers

如下为一个conan 包 jpegwrapper的依赖树,其中common_source_cpp的类型(package_type)为header_only,libjpeg-turboopenjpegelibrary,

在这里插入图片描述
如下为jpegwrapperr 测试项目的依赖定义文件conanfile.txt

[requires]
cimg/2.8.3
jpegwrapper/1.1.1-dev
[generators]
CMakeDeps
CMakeToolchain

对应的测试项目的依赖树如下

在这里插入图片描述
如果简单的如下定义jpegwrapper的依赖库列表

from conan import ConanFile
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain
from conan.tools.env import VirtualBuildEnv
class JpegwrapperConan(ConanFile):
	requires="libjpeg-turbo/2.1.5","openjpeg/2.3.1","common_source_cpp/1.0.1"

会在测试项目编译时报错CImg.h找不到jpeglib.h,也就是turbo-jpeg的头文件。为会这样呢?
这是因为对于library类型的依赖包,库文件可以向下传递,但头文件对于下游默认不可见的。
而上面测试项目的依赖树中cimg这个header_only的包中头文件引用了jpeglib.h,所以问题就发生了。

我们详细看一下requirements()中对于transitive_headers,transitive_libs特性的说明:

transitive_headers
If True the headers of the dependency will be visible downstream.
为True则依赖库的头文件对于下游可见

transitive_libs
If True the libraries to link with of the dependency will be visible downstream.
为True则依赖库的库文件对于下游可见

再回顾一下上面《Requirement traits》章节,发现不论是static-library还是shared-library类型都没有定义transitive_headers为True,即conan不会将openjpeg和turbo-jpeg的头文件传递jpegwrapper的下游调用者(consumer)。
所以CMakeDeps generator为turbo-jpeg生成的cmake配置文件中定义的import target中没有将依赖库的头文件位置定义到INTERFACE_INCLUDE_DIRECTORIES属性,最终生成的Makefile中也就自然没有turbo-jpeg的头文件位置

要解决这个问题,就是要更新jpegwrapper的conanfile.py中对于依赖库的定义方式,通过self.requires()方法强制指定transitive_headers=True

from conan import ConanFile
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain
from conan.tools.env import VirtualBuildEnv
class JpegwrapperConan(ConanFile):
	# requires="libjpeg-turbo/2.1.5","openjpeg/2.3.1","common_source_cpp/1.0.1"
    def requirements(self):
        self.requires("common_source_cpp/1.0.1", transitive_headers=True)
        self.requires("libjpeg-turbo/2.1.5", transitive_headers=True)
        self.requires("openjpeg/2.3.1", transitive_headers=True)

jpegwrapper的conanfile.py的完整代码参见 https://gitee.com/l0km/jpegwrapper/blob/master/conanfile.py

参考资料

requirements()
package-type

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

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

相关文章

手把手webpack搭建前端架子

这里以react为例> (一)初始化package.json package name: 你的项目名字叫啥 version: 版本号 description: 对项目的描述 entry point: 项目的入口文件(一般你要用那…

web静态网页设计与制作-基于HTML+CSS+JS实现旅游摄影网站

web静态网页设计与制作,基于HTMLCSSJS实现精美的旅游摄影网站,拥有极简的设计风格,丰富的交互动效,让人眼前一亮,享受视觉上的体验。 我使用了基本的HTML结构来构建网页,并使用CSS样式进行美化设计&#xf…

在 Ubuntu 上安装最新版的 Calibre

目录 前言 方法1:从 Ubuntu 的仓库安装 Calibre 卸载 Calibre 方法2:获取最新版本的 Calibre 卸载 Calibre 结语 前言 Calibre 是一款自由开源的电子书软件。下面介绍如何在 Ubuntu Linux 上安装它。 作为电子书管理的瑞士军刀,Calibre …

软件开发的高效神器,程序员爱不释手

目录 一、低代码助力开发 二、低代码核心功能 1.业务建模: 2.表单建模: 3.页面建模: 4.流程建模: 5.报表建模: 6.门户建模: 7.大屏建模: 8.移动建模: 三、低代码解放程序员的双手 在…

POE交换机——电源解决方案-升压控制器\降压控制器\中高压降压转换器

PoE是一种有线以太网供电技术,使用于数据传输的网线同时具备直流供电的能力,PoE供电具有可靠、连接简捷、标准统一的优势。越来越多的工业物联网设备开始采用PoE供电, 如IP电话、网络视频监控以及无线以太网设备等。 PoE交换机是一种用于提供…

VMware Workstation 17 虚拟机自启动失效 解决脚本

VMware Workstation17新增加了虚拟机自启配置 但是很奇怪在我的一台计算机上能够自启,在另一台计算机上就失效 编写脚本 以命令方式完成虚拟机开机自启 #虚拟机自启.batif "%1""hide" goto CmdBegin start mshta vbscript:createobject("w…

安卓手机SD卡不小心删除了怎么办?几步轻松恢复数据!

随着科技的不断发展,安卓手机已经成为了我们生活中不可或缺的一部分。然而,在使用安卓手机的过程中,我们有时会不小心将重要的文件或者照片删除掉,这无疑会给我们的生活带来不便。那么,当安卓手机的SD卡不小心被删除了…

Ubuntu 22.04.3编译AOSP13刷机

文章目录 设备信息下载AOSP并切换分支获取设备驱动编译系统编译遇到的问题Cannot allocate memoryUbuntu设置USB调试刷机参考链接 设备信息 手机:Pixel 4XL 下载AOSP并切换分支 在清华大学开源软件镜像站下载初始化包aosp-latest.tar。 解压缩,切换到…

【GCC】1:chatgpt:NetworkControllerInterface、GoogCcNetworkController

代码基于 mediasoup-sfu-cpp 中的m77版本。使用chatgpt辅助学习。网络状态估计器:开发中 D:\XTRANS\soup\mediasoup-sfu-cpp\deps\libwebrtc\libwebrtc\api\transport\network_control.h NetworkControllerInterface 网络控制器 此类,使用 网络状态和 通信状态 以 估计网络参…

快看!!电子杂志这样制作!几分钟的事

今天手把手教你怎么轻松制作电子杂志,不费力又不耗时。还能让你的杂志跟专业设计师们排排的相提并论,一起来学习吧! 首先,你需要准备一些图片、文字素材,以及一款适合你的电子杂志制作软件。目前市面上有很多电子杂志…

面试:ShardingSphere问题

文章目录 什么是ShardingSphere,它的主要功能是什么?ShardingSphere的核心模块有哪些?他们是如何工作的?ShardingSphere 的读写分离是如何实现的?如何配置ShardingSphere的数据分片策略?ShardingSphere支持…

Android Studio 显示build variants工具栏

工具栏: 如下图所示 依次点击View-->ToolWindows-->Build Variants。 在此记个笔记

MAC M系列芯片安装 openJDK17

文章目录 1. 查找openjdk版本2. 安装openjdk3. 多jdk之间的切换 在这里我们使用 brew 命令查找并安装。 1. 查找openjdk版本 执行:brew search openjdk,注意:执行命令后,如果得到的结果中没有红框内容,则需要更新一下…

Odoo:行业领先的免费开源生产制造管理系统

产品生命周期管理 用 Odoo 产品数据管理解决方案加速产品开发 研究、开发和设计新产品或者重新设计现有产品是所有制造企业的活力之源,但很多企业的设计部门和工程部门却完全脱离 ERP 系统。这导致工程师需要耗费大量时间来回答企业中其他部门就产品状态、修改级别…

虚拟机VMware下CentOS7.9对磁盘扩容

首先是在VMware虚拟下对机器进行关机,然后扩容后启动机器(操作简单,忽略,网上很多) 开始增加磁盘空间 查看磁盘空间 发现此时磁盘空间仍然没变化 df -lh 查看当前磁盘分区信息 fdisk -l 对新加磁盘空间进行分区操…

优秀的5款字体设计软件推荐

字体设计作为设计中的一个重要模块,如果字体软件选择正确,将给字体设计工作带来极大的便利,易于使用的字体设计软件,可以创造出优秀的排版设计。在日常工作中,设计师可能会在字体网站上下载字体,然后安装字…

仙女麻麻看过来~这是不是你们在找的外套?

分享女儿的秋冬穿搭 时尚与美观兼具的毛毛外套 洋气百搭不挑人穿 谁穿对都好看系列 经典宽松版型 不臃肿对身材包容性很强 小编墙裂推荐哦!!

高清动态壁纸软件Live Wallpaper Themes 4K mac中文版功能

Live Wallpaper & Themes 4K mac是一款提供各种高清动态壁纸和主题的应用程序。该应用程序提供了大量的动态壁纸和主题,包括自然、动物、城市、抽象等各种类别,可以满足用户不同的需求。除了壁纸和主题之外,该应用程序还提供了许多其他功…

pytest系列——pytest-base-url插件之配置可选的项目系统URL

前言 ①当我们的自动化代码完成之后,通常期望可以在不同的环境进行测试,此时可以将项目系统的URL单独拿出来,并且可以通过pytest.ini配置文件和支持pytest命令行方式执行。 ② pytest-base-url 是一个简单的pytest插件,它通过命…

NX二次开发UF_CSYS_set_wcs 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_wcs Defined in: uf_csys.h int UF_CSYS_set_wcs(tag_t csys_id ) overview 概述 Sets the work coordinate system to the prototype coordinate system whose tag y…