简述

C++程序的依赖管理是一个由来已久的问题, 仅在Windows上就有程序就有Visual Studio, MinGW等多种编译器, 即使是Visual Studio下编译的结果的也有静态库, 动态库, x86,x86_x64程序之分, 针对运行和调试环境有Debug和Release2种配置, 还有MD和MT这样的动态库依赖方式之分, 仅仅针对一个库的一个版本可能产生多种编译结果, 开发团队为了自己需要会针对不同配置把一种库编译多次, 库文件的存储和管理都成问题.

为了简化SOUP依赖库的管理, 为保证基于C++语言的第三方库以及我们自己开发的各种基础库能在之后的多个项目中方便使用, 需要一种好的依赖管理方式, 从而保证我们可以简化开发环境和规范SOUP依赖管理方式, 把更多精力用在实际项目开发中.

Conan是一个开源,分布式和多平台包管理器,用于创建和共享所有C++二进制包文件。

安装Conan

Conan的使用需基于Python, 安装方式很简单:
pip install conan==1.17.0
(注意, 目前发现高版本的conan可能会有问题,最好使用1.17.0)

添加Conan服务器地址

设定Conan服务器地址, 则以后可以方便我们在一个团队内上传和下载相应的依赖库
使用命令 conan remote add local http://192.168.0.187:9300 
在上面的命令中, local是服务器的名称, 会在后续命令中经常用到

创建conan包并上传到服务器

在conan上搜索包

本地搜索: conan search <name>
服务器搜索: conan search <name> -r <server_name>
例子: conan search vtk -r local (在服务器搜索vtk)

创建一个包路径, 并包含conan包结构

conan new <name> --bare
如 conan new mylib/0.1@imaging/dev --bare, conan会自动创建默认的conanfile.py文件

打包已经编译好的第三方库到conan

  • conan包名定义: name/version@user/channel (user和channel 是可选的), 例如VTK/8.2.0@imaging/dev
  • 使用conan的根本目的在于我们希望第三方库只编译一次就可以给所有人使用, 所以首先需要编译好我们需要的库

conan依赖管理使用方法_conan

  • 以VTK为例, 准备编译好的库文件以以上文件结构排布, include目录包含所有头文件, lib下包括了Debug和Release的静态库
  • 下面在主目录中创建conanfile.py:
from conans import ConanFile
import os
import fnmatch

class VTKConan(ConanFile):
name = "VTK"
version = "8.2.0"
license = "BSD license"
author = "Kitware"
url = "https://vtk.org/"
topics = ("Visualization")
settings = "os", "compiler", "build_type", "arch"
description = "Visualization Toolkit"

def package(self):
self.copy("*")

def package_info(self):
self.cpp_info.includedirs = ["include"]
self.cpp_info.release.libdirs = ["lib/Release"]
self.cpp_info.debug.libdirs = ['lib/Debug']

self.cpp_info.release.libs = fnmatch.filter(
os.listdir('lib/Release'), '*.lib')
self.cpp_info.debug.libs = fnmatch.filter(
os.listdir('lib/Debug'), '*.lib')

在该文件中定义了库相关信息和该库所包含的头文件, 库文件或bin文件的组织方式, 打包时即可应用.

  • 下面可以打包库了, 运行:
    conan export-pkg . VTK/8.2.0@imaging/stable
    运行该命令执行打包, 打包时执行了相应的arch, 因此针对同一个包可以打针对不同的操作系统和架构的包, 执行成功则该库已经成功打包到本地缓存中.
  • 上传库文件到服务器
    conan upload <name> -r <server_name> --all --force

在已有项目中使用conan的库

  • 编写conanfile.txt, 该文件描述了当前项目需要何种conan包以及使用何种方式, 以下是一个Windows下Visual Studio的例子
[requires]
VTK/8.2.0@imaging/stable
[generators]
visual_studio

该文件描述了当前项目依赖于vtk, 并且使用Visual Studio

  • 下载和使用依赖库
    运行 conan install . -s arch=x86_64 -r local--update 则会根据指定的设置自动查找和下载相应的依赖库, 并生成conanbuildinfo.props (--update参数会自动从conan服务器查找最新的库), 在Visual Studio工程中的property manager里面加入该props文件, 则完成了对第三方库的依赖, 基本可以进行正常编译.

注意, 如果当前项目同时包含conanfile.txt和conanfile.py (既依赖第三方库同时自身也可以作为库导出到conan), 那么在conan install时候需要手动指定conanfile.txt文件, 因为conanfile.py里面可能没有包含依赖项.如:
conan install .\conanfile.txt -s arch=x86_64 -r local --update

  • 更多conan命令和语法, 访问https://docs.conan.io/en/latest/