前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >conan入门(四):conan 引用第三方库示例

conan入门(四):conan 引用第三方库示例

作者头像
10km
发布2022-04-13 11:24:58
2.5K0
发布2022-04-13 11:24:58
举报
文章被收录于专栏:10km的专栏10km的专栏

conan 引用第三方库示例

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 包命名约定

标准的conan 包名引用(reference)格式是:package_name/version@user/channel,用于在制品仓库中唯一的识别一个包

  • package_name 包名
  • version 版本号
  • user [可选]上传包的用户/组织名
  • channel [可选]一般用来区分制品的成熟度,比如 stable --稳定版本,testing --测试版本

在向制品仓库上传包时,包名中package_name/version是必须要有的字段.user,channel都是可选字段,上传用户在上传包时可以不指定。

cJSON示例程序

示例的所有源码都保存在GIT仓库 conan_example,你可以跳过手工创建文件和文件夹的过程直接克隆代码到本地: git clone https://gitee.com/l0km/conan_example.git

如下创建一个简单的cJSON的示例程序,以JSON格式输出使用的cJSON库的版本号:

json_test.c

代码语言:javascript
复制
#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

创建conanfile.txt文件用于指定json_test.c程序的依赖库cjson

代码语言:javascript
复制
[requires]
cjson/1.7.13

[generators]
cmake

关于conanfile.txt的详细说明参见Conan官方文档《conanfile.txt》

conan search

创建conanfile.txt过程中我们可以通过conan search cjson -r conancenter查看远程conan中央仓库有哪些cJSON版本,然后决定自己能使用的版本

代码语言:javascript
复制
$ 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 可以查看指定的包的基本信息

代码语言:javascript
复制
$ 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》

CMakeLists.txt

基于CMake构建项目就需要创建CMakeLists.txt脚本用于生成最终的编译工程文件:

代码语言:javascript
复制
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管理依赖库的项目来说这是必须的

代码语言:javascript
复制
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

${CMAKE_BINARY_DIR}/conanbuildinfo.cmake这个文件并不存在于项目代码中,它会由后续要介绍的conan install自动生成。

{CONAN_LIBS}变量也不是由项目定义的,是在{CMAKE_BINARY_DIR}/conanbuildinfo.cmake项目依赖库列表

conan install 安装依赖库

好了现在构建cJSON示例程序所需要所有文件:json_test.c,conanfile.txt,CMakeLists.txt都已经准备齐了。我们需要执行conan install安装依赖库

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
conan install cjson/1.7.13@

@很重要,有这个后缀才conan install才会把输入参数当做一个包名,如果没有@,conan install 会把 cjson/1.7.13当做一个路径

关于 conan install更详细的说明参见Conan官方文档:《conan install》

build json_test

依赖库安装完成后,后续的项目编译就与普通的CMake编译项目过程没啥区别了:

生成编译工程文件(以Visual Studio 2015为例):

代码语言:javascript
复制
# 生成编译工程文件(以Visual Studio 2015为例):
$ cmake .. -G "Visual Studio 14 2015 Win64"

编译项目

代码语言:javascript
复制
$ cmake --build . --config Release

运行测试程序

代码语言:javascript
复制
$ ./bin/json_test
{
    "version":      "1.7.13"
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • conan 引用第三方库示例
    • conan 包命名约定
      • cJSON示例程序
        • json_test.c
        • conanfile.txt
        • conan search
        • conan inspect
        • CMakeLists.txt
        • conan install 安装依赖库
        • build json_test
    相关产品与服务
    持续集成
    CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档