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

39 篇文章 73 订阅

本文适用于conan 1.x版本,当前conan版本已经升级到2.x,2.x下引用第三方示例的介绍请参见《conan入门(三十九):conan 2.x 引用第三方库示例》

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,你可以跳过手工创建文件和文件夹的过程直接克隆代码到本地,切换到conan1.x分支:
git clone https://gitee.com/l0km/conan_example.git -b conan1.x

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

json_test.c

#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

[requires]
cjson/1.7.13

[generators]
cmake

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

conan search

创建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 可以查看指定的包的基本信息

$ 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脚本用于生成最终的编译工程文件:

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项目依赖库列表

conan install 安装依赖库

好了现在构建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》

build json_test

依赖库安装完成后,后续的项目编译就与普通的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入门(一):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将包安装到本地项目或其他指定位置》
《conan入门(二十六):使用make编译makefile》
《conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败》
《conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题》
《conan入门(二十九):对阿里mnn进行Conan封装塈conans.CMake和conan.tools.cmake.CMake的区别》
《conan入门(三十):对腾讯ncnn进行Conan封装》
《conan入门(三十一):在命令行(shell)中从profile中读取配置参数》
《conan 入门(三十二):package_info中配置禁用CMakeDeps生成使用项目自己生成的config.cmake》
《conan 入门(三十三):requirements()指定header的可见性(transitive_headers)》
《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》
《conan 入门(三十五):在conanfile.py中获取C++编译器完整路径的方法》
《conan入门(三十六):在set_version方法中从pom.xml中读取版本号实现动态版本定义》
《conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)》
《conan 入门(三十八):conan二进制包的兼容性及自定义package_id的方式》
《conan入门(三十九):conan 2.x 引用第三方库示例》

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值