Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。
它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任意数量的不同版本的包创建和重用任意数量的不同二进制文件(用于不同的配置,如架构、编译器版本等),在所有平台上使用完全相同的过程。由于它是去中心化的,因此很容易运行自己的服务器来私下托管自己的包和二进制文件,而无需共享它们。@《Conan官方文档》
本文从一个示例开始:我们将创建一个使用cJSON应用程序来说明如何基于CMake 作为构建系统使用Conan无平台差异的引入依赖库。
conan适用于任何构建系统,并且不限于使用 CMake。
标准的conan 包名引用(reference)格式是:package_name/version@user/channel
,用于在制品仓库中唯一的识别一个包
stable
--稳定版本,testing
--测试版本在向制品仓库上传包时,包名中package_name/version
是必须要有的字段.user,channel
都是可选字段,上传用户在上传包时可以不指定。
示例的所有源码都保存在GIT仓库 conan_example,你可以跳过手工创建文件和文件夹的过程直接克隆代码到本地:
git clone https://gitee.com/l0km/conan_example.git
如下创建一个简单的cJSON的示例程序,以JSON格式输出使用的cJSON库的版本号:
#include "cjson/cJSON.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv)
{
char verbuf[32];
snprintf(verbuf,sizeof(verbuf),"%d.%d.%d",CJSON_VERSION_MAJOR,CJSON_VERSION_MINOR,CJSON_VERSION_PATCH);
cJSON* vj = cJSON_CreateString(verbuf);
cJSON* rootj = cJSON_CreateObject();
cJSON_AddItemToObject(rootj,"version",vj);
char* jstr = cJSON_Print(rootj);
printf("%s\n",jstr);
free(jstr);
cJSON_Delete(rootj);
return 0;
}
创建conanfile.txt文件用于指定json_test.c程序的依赖库cjson
[requires]
cjson/1.7.13
[generators]
cmake
关于conanfile.txt的详细说明参见Conan官方文档《conanfile.txt》
创建conanfile.txt过程中我们可以通过conan search cjson -r conancenter
查看远程conan中央仓库有哪些cJSON版本,然后决定自己能使用的版本
$ conan search cjson -r conancenter
Existing package recipes:
cjson/1.7.12
cjson/1.7.13
cjson/1.7.14
cjson/1.7.15
-r
参数用于指定搜索的远程仓库名字,如果不加 -r
参数,则默认搜索本地仓库,-r all
则指定在所有远程仓库搜索包
关于conan search命令的更详细用法参见Conan官方文档《conan search》
执行conan inspect
可以查看指定的包的基本信息
$ conan inspect cjson/1.7.13
name: cjson
version: 1.7.13
url: https://github.com/conan-io/conan-center-index
homepage: https://github.com/DaveGamble/cJSON
license: MIT
author: None
description: Ultralightweight JSON parser in ANSI C.
topics: ('cjson', 'json', 'parser')
generators: cmake
exports: None
exports_sources: None
short_paths: False
apply_env: True
build_policy: None
revision_mode: hash
settings: ('os', 'arch', 'compiler', 'build_type')
options:
fPIC: [True, False]
shared: [True, False]
use_locales: [True, False]
utils: [True, False]
default_options:
fPIC: True
shared: False
use_locales: True
utils: False
deprecated: None
-r
指定远程仓库名字,不加-r
参数默认从Conan中央仓库(conancenter)获取包的信息
关于conan inspect
命令的详细说明参见Conan官方文档《conan inspect》
基于CMake构建项目就需要创建CMakeLists.txt脚本用于生成最终的编译工程文件:
cmake_minimum_required(VERSION 2.8.12)
project(JsonTest)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(json_test json_test.c)
target_link_libraries(json_test ${CONAN_LIBS})
这是个非常 简单的cmake脚本,与普通的cmake脚本不一样的就是下面这两行,用于conan的初始化设置,对于使用conan管理依赖库的项目来说这是必须的
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
${CMAKE_BINARY_DIR}/conanbuildinfo.cmake
这个文件并不存在于项目代码中,它会由后续要介绍的conan install
自动生成。
${CONAN_LIBS}
变量也不是由项目定义的,是在${CMAKE_BINARY_DIR}/conanbuildinfo.cmake
项目依赖库列表
好了现在构建cJSON示例程序所需要所有文件:json_test.c,conanfile.txt,CMakeLists.txt
都已经准备齐了。我们需要执行conan install
安装依赖库
$ mkdir build && cd build
$ conan install ..
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=Visual Studio
compiler.runtime=MD
compiler.version=14
os=Windows
os_build=Windows
[options]
[build_requires]
[env]
cjson/1.7.13: Not found in local cache, looking in remotes...
cjson/1.7.13: Trying with 'conancenter'...
Downloading conanmanifest.txt
Downloading conanfile.py
Downloading conan_export.tgz
cjson/1.7.13: Downloaded recipe revision 0
conanfile.txt: Installing package
Requirements
cjson/1.7.13 from 'conancenter' - Downloaded
Packages
cjson/1.7.13:f258128103040cdfe7319aa827fed44cc91df1e4 - Download
Installing (downloading, building) binaries...
cjson/1.7.13: Retrieving package f258128103040cdfe7319aa827fed44cc91df1e4 from remote 'conancenter'
Downloading conanmanifest.txt
Downloading conaninfo.txt
Downloading conan_package.tgz
cjson/1.7.13: Package installed f258128103040cdfe7319aa827fed44cc91df1e4
cjson/1.7.13: Downloaded package revision 0
conanfile.txt: Generator txt created conanbuildinfo.txt
conanfile.txt: Generator cmake created conanbuildinfo.cmake
conanfile.txt: Aggregating env generators
conanfile.txt: Generated conaninfo.txt
conanfile.txt: Generated graphinfo
conan install
命令用于安装下载配置项目(conanfile.py 或 conanfile.txt)要求的依赖库,本文示例的cJSON没有其他依赖库,如果依赖库自身还有别的依赖库,则递归下载所有依赖。执行conan install
命令还会在当前目录中创建conanbuildinfo.cmake
文件,就是前面CMakeLists.txt中引用的脚本。
在上面的执行conan install
时指定..
作为路径参数,即指定下载../conanfile.txt
中[requires]
定义的所有依赖库。
conan install还可用于安装指定引用的具体包,如下即安装cjson/1.7.13
,
conan install cjson/1.7.13@
@
很重要,有这个后缀才conan install
才会把输入参数当做一个包名,如果没有@
,conan install
会把 cjson/1.7.13
当做一个路径
关于 conan install
更详细的说明参见Conan官方文档:《conan install》
依赖库安装完成后,后续的项目编译就与普通的CMake编译项目过程没啥区别了:
生成编译工程文件(以Visual Studio 2015为例):
# 生成编译工程文件(以Visual Studio 2015为例):
$ cmake .. -G "Visual Studio 14 2015 Win64"
编译项目
$ cmake --build . --config Release
运行测试程序
$ ./bin/json_test
{
"version": "1.7.13"
}
《conan入门(一):conan 及 JFrog Artifactory 安装》
《conan入门(二):conan 服务配置-密码管理及策略》
《conan入门(三):上传预编译的库(artifact)》
《conan入门(四):conan 引用第三方库示例》
《conan入门(五):conan 交叉编译引用第三方库示例》
《conan入门(六):conanfile.txt conanfile.py的区别》
《conan入门(七):将自己的项目生成conan包》
《conan入门(八):交叉编译自己的conan包项目》
《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
《conan入门(十):Windows下Android NDK交叉编译Boost》
《conan入门(十一):Linux下Android NDK交叉编译Boost》
《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
《conan入门(十三):conan info 命令的基本用法》
《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
《conan入门(十六):profile template功能实现不同平台下profile的统一》
《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
《conan入门(十九):封装第三方开源库cpp_redis示例》
《conan入门(二十):封装只包含头文件(header_only)的库示例》
《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
《conan入门(二十二):编译 openssl要求python 3.7以上版本》
《conan入门(二十三):Windows下MinGW编译libcurl》
《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
《conan入门(二十五):imports将包安装到本地项目或其他指定位置》