最新文�? 原创 : TQTT_KU5P开发板教程---HDMI接口显示测试640X480 原创 : 纯FPGA控制AD9361的思路和实现之一 概述 原创 : 纯FPGA实现AD9361控制的思路和实现 UART实现AXI_MASTER 原创 : Tinyb210上手手册 原创 : TQTT_KU5P开发板教程---HDMI接口显示测试1024X768
c/c++包管理工具conan搭建和原理 历史版本:
上次修改时间: 2021-06-29 09:28:50

conan

conan是一个c++包管理工具。
C/C++为了兼容性,即一样的代码,用任何编译器都可以编译通过,然而编写c/c++程序。有百分30的时间都是在环境上打转,比如编译依赖库,修改环境以满足编译的要求,从需求来看极需要一个c/c++编译工程的专门管理性工具。 conan是目前最满足上述需求的轮子。
在c++开发中,常见的c++依赖形式有:

  1. 源代码级别的依赖引入,对应就是代码分发
  2. 静态库级别的依赖引入,对应的就是二进制文件分发

同时在c++开发中开发者还需要为构建不同平台编译器,不同目标编译及运行时依赖,不同代码构建工具比如cmake,makefile,还有脚本化编译需要不同的PATH环境目录。

conan基于python脚本,在程序中修改上面需要修改的配置,用一个脚本conanfile.py来控制编译的方方面,用conan命令行来解析py脚本来实现编译,依赖组合,体现在了:

  • 每个软件包和他所依赖的包都是一个recipe,recipe脚本也就是conanfile.py包含了从哪里获取该软件源码,或者是二进制包包含了该源码的编译环境(通过临时修改PATH环境变量),通过conan build命令行来执行recipe中的build方法来实现编译。
  • 源代码分发的获取(source方法)
  • 源代码包的编译配置,cmake配置,环境变量的脚本级切换,还有仓库代码的管理,依赖的组织。
  • 在recipe中配置不同的编译器,在脚本中对不同的编译环境进行配置,对于不同平台和编译器,在编译脚本中对应的产出也是不同,conan能够自动区分文件位置,在使用时候只要指定编译的profile就能获得某个平台或者编译器的产物,无需手动。
  • 在recipe中配置软件包的产物,产物可以是纯源码应对代码分发,也可以是二进制库应对一些需要二进制分发的场景。
  • 在recipe中可以指定依赖包,当编译当前包的依赖包不存在时,conan会预先编译依赖包,然后编译当钱包,无需人工操作。
  • 对于使用方而言,conaninfo.txt可以直接将包产出导出到本地,通过一个文件即可完成不同平台的依赖分发。

conan的缺点大概就是本身比c/c++的编译系统还复杂,也许搞懂这套编译系统,库早就编译出来了,更何况需要对包编写包脚本,大大加高了学习曲线。
anyway ,假如你的团队的代码是跨平台的大型底层库,需要有非常多的依赖,以及多平台的交付,那么用conan来管理程序编译环境是不错选择。 本文专门说明了 conan新建依赖包的细节。
image.png

前文

c/c++包管理工具conan使用和搭建

打包的目的

conan的依赖管理实际上是提供了一套可复制的脚本,可以从无到有还原出依赖包生成的过程。
以开源库https://gitee.com/290198252/generallib为例

能打什么样的包

  1. 二进制包 二进制包里面只包含二进制文件,可以被直接使用
  2. 代码包 代码包只包含代码,可以作为依赖被编译,也可以在打包过程中编译出来。
  3. 纯头文件包 有些库提供的是纯头文件的形式,比如eigen,sigslot等,纯头文件包和代码包的处理方式类似。

那些库可以被打包

  1. 自己编写的代码:自己编写的代码只需要将需要打包的数据export到本地仓库即可。
  2. 第三方库

新建包相关的命令

新建包

conan {子命令} 参数....

   new        Creates a new package recipe template with a 'conanfile.py' and optionally,
             'test_package' testing files.
  create     Builds a binary package for a recipe (conanfile.py).
  upload     Uploads a recipe and binary packages to a remote.
  export     Copies the recipe (conanfile.py & associated files) to your local cache.
  export-pkg Exports a recipe, then creates a package from local source and build folders.
  test       Tests a package consuming it from a conanfile.py with a test() method.

如何新建依赖包

  1. 在库目录下执行
conan new generallib/1.0

完成后会在库目录下生成conanfile.py。
2. 修改confile.py

from conans import ConanFile, CMake, tools
class GenerallibConan(ConanFile):
    name = "generallib"
    version = "1.0"
    license = "GPL"
    author = "caiyuzheng"
    url = "https://gitee.com/290198252/generallib"
    description = "a simple cpp basic library"
    settings = "os"
    generators = "cmake"
    exports_sources = "general*", "test*"
    
    def build(self):
        cmake = CMake(self)
        cmake.configure(source_folder=".")
        cmake.build()
    def package(self):
        self.copy("*", dst="include", src="general")

由于我们是打包自己编写的代码,代码也存在本地,因此就不需要source()方法来下载其他的包。
如果不是我们自己编写的代码,或者说希望这个包被第三方所使用,那么可以使用还需要source函数:

def source(self):
        self.run("wget https://github.com/jbeder/yaml-cpp/archive/yaml-cpp-0.6.0.zip")
        self.run("unzip yaml-cpp-0.6.0.zip .")
        # This small hack might be useful to guarantee proper /MT /MD linkage
        # in MSVC if the packaged project doesn't have variables to set it
        # properly
        tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(HelloWorld)",
                              '''PROJECT(HelloWorld)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''')

上面代码git clone了源代码,然后解压缩到了本地文件夹。
该函数在命令行执行conan source . 后执行,用于获取源代码包。
本地库路径如下图
image.png
exports_sources = "general*", "test*",exports_sources 属性指的是将这两个本地文件夹打包在包里面。

导出包到本地目录

执行

conan export .

执行完成后在.conan的data目录下就会出现generalib1.0的库。
image.png
打开这个仓库的文件目录,可以看见export的general,test文件夹
image.png

上传包到服务器

在包文件目录下执行

# 先认证远程服务器
conan user conan user -p {密码} -r {远程服务器名} {用户名}
conan upload -r home generalib

过程如下

image.png 执行成功后在服务端的后台可以看到

image.png
自己上传的包文件

confile.py的参考配置

全部配置见 conanfile.py
下面说几个常见的配置及函数

  • settings属性: 开发项目范围内的变量,如编译器、其版本或操作系统本身。必须定义这些变量,并且它们不能在conanfile中列出默认值,这是由依赖使用者来选择,而脚本可以根据选择来进行合适的操作,比如下载某个操作系统的特定位数的软件。
  • source()方法: 该方法在执行 conan source 的时候调用,作用是获取脚本化地待操作的源代码,有时候想把第三方库打包成conan repo,这个获取第三方库的流程,可能随着操作系统,编译器的不同而不同,写成脚本可以让依赖的使用者省去自己下载库的时间。
  • build()方法 此方法用于使用所需命令构建配方的源代码。使用命令行工具来调用构建系统或Conan提供的任何构建助手。 conan提供了以下的编译助手:

如果包进行了修改,如何更新

首先执行export

conan export .

然后执行upload

conan upload --force -r home generallib

注意更新包,最好还是新建版本,这样就不会和旧的版本冲突。

编译包

在本地创建包的时候,就可以将包进行测试编译,操作如下

  1. 先指定要编译的编译器
conan install . -pr msysgcc64
  1. 编译包
conan build . 

执行build指令会调用conanfile.py中的build()函数

    def build(self):
        cmake = CMake(self)
        print(cmake.generator)
        self.run('cmake pkgsrc')
        self.run('cmake --build pkgsrc --clean-first')

build方法无法指定profile,如果要测试build方法,使用conan create . -pr=profile,可以用于测试指定profile的编译。 conan提供了cmake huild helper对象 上述操作相当于在执行了

cmake . -G"XXX"; make clean;make;

方便的是conan会自动根据profile设定的编译器来推测generator。比如是windows下的gcc,他会自动推测-G"MinGW Makefiles"

相关配置

环境变量CONAN_USER_HOME,指定conan数据文件目录。

拓展

本文假定generallib是一个纯源代码依赖包,使用者引入该依赖,仅仅是使用该包包含的源文件和头文件,不涉及到二进制库的打包,以及打包库的编译等操作,因此仅仅设置exports项,把本地源文件传入包即可。仅仅作为演示conan上传包的操作。

0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image

. 闽ICP备19002644号