conan入门(三十九):conan 2.x 引用第三方库示例

2023-12-21 12:25:34

去年写过一篇博客《conan入门(四):conan 引用第三方库示例》,以一引用cjson为例介绍如何使用conan管理第三方库的引用,但是当时使的conan最新版本是1.45,这一年多conan经过了很多的版本迭代,目前最新版本已经是2.0.14。
conan 1.0和2.0版本有很多的差异。所以原来的文章内容已经不适合2.0,本文在原文的基础上,还是以cjson为例介绍如何在2.0下引用第三方库。

conan 包命名约定

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

  • package_name 包名
  • version 版本号

cJSON示例程序

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

如下创建一个简单的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]
CMakeToolchain
CMakeDeps

因为本示例使用CMake构建项目所以[generators]定义CMakeToolchain,CMakeDeps用于后续conan install命令生成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
cjson/1.7.16

-r 参数用于指定搜索的远程仓库名字,如果不加 -r参数,则默认搜索本地仓库,-r all则指定在所有远程仓库搜索包

关于conan search命令的更详细用法参见Conan官方文档《conan search》

CMakeLists.txt

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

cmake_minimum_required(VERSION 2.8.12)
project(JsonTest)

find_package(cJSON REQUIRED)
add_executable(json_test json_test.c)
target_link_libraries(json_test cjson::cjson)

这是个非常 简单的cmake脚本,与普通的cmake脚本,没有与conan相关的任何内容

conan install 安装依赖库

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

$ mkdir build && cd build
$ conan install .. -of . --build missing
======== Input profiles ========
Profile host:
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++11
compiler.version=8
os=Linux

Profile build:
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++11
compiler.version=8
os=Linux


======== Computing dependency graph ========
Graph root
    conanfile.txt: /home/guyadong/workspace/conan_example/conanfile.txt
Requirements
    cjson/1.7.13#1f9d9a5c277925857929caff50f88f36 - Cache

======== Computing necessary packages ========
Requirements
    cjson/1.7.13#1f9d9a5c277925857929caff50f88f36:3bfccb3121a781d41dc5494d60bc05cb9f6811c3#dfe0e6e82bffcb17fb573c9422b4f405 - Cache

======== Installing packages ========
cjson/1.7.13: Already installed! (1 of 1)
WARN: deprecated: Usage of deprecated Conan 1.X features that will be removed in Conan 2.X:
WARN: deprecated:     'cpp_info.names' used in: cjson/1.7.13
WARN: deprecated:     'cpp_info.build_modules' used in: cjson/1.7.13

======== Finalizing install (deploy, generators) ========
conanfile.txt: Writing generators to /home/guyadong/workspace/conan_example/build
conanfile.txt: Generator 'CMakeToolchain' calling 'generate()'
conanfile.txt: CMakeToolchain generated: conan_toolchain.cmake
conanfile.txt: Preset 'conan-release' added to CMakePresets.json. Invoke it manually using 'cmake --preset conan-release' if using CMake>=3.23
conanfile.txt: If your CMake version is not compatible with CMakePresets (<3.23) call cmake like: 'cmake <path> -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/home/guyadong/workspace/conan_example/build/conan_toolchain.cmake -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release'
conanfile.txt: CMakeToolchain generated: CMakePresets.json
conanfile.txt: CMakeToolchain generated: ../CMakeUserPresets.json
conanfile.txt: Generator 'CMakeDeps' calling 'generate()'
conanfile.txt: Generating aggregated env files
conanfile.txt: Generated aggregated env files: ['conanbuild.sh', 'conanrun.sh']
Install finished successfully

conan install命令用于安装下载配置项目(conanfile.py 或 conanfile.txt)要求的依赖库,本文示例的cJSON没有其他依赖库,如果依赖库自身还有别的依赖库,则递归下载编译所有依赖。执行conan install命令还会在当前目录中创建一堆的相关文件,如下:

cJSONConfig.cmake
cJSONConfigVersion.cmake
cJSON-release-x86_64-data.cmake
cJSON-Target-release.cmake
cJSONTargets.cmake
cmakedeps_macros.cmake
CMakePresets.json
conanbuildenv-release-x86_64.sh
conanbuild.sh
conanrunenv-release-x86_64.sh
conanrun.sh
conan_toolchain.cmake
deactivate_conanbuild.sh
deactivate_conanrun.sh

其中编译工具链文件conan_toolchain.cmake会在后面的被引用

在上面的执行conan install时指定..作为路径参数,即指定下载../conanfile.txt[requires]定义的所有依赖库。

补充

conan install还可用于安装指定引用的具体包,如下即安装cjson/1.7.13

conan install --requires=cjson/1.7.13 -r conancenter

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

build json_test

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

生成编译工程文件(以gcc为例):

# 生成编译工程文件(以gcc为例):
$ cd build
$ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=RELEASE

编译项目

$ cd build
$ cmake --build . 

运行测试程序

$ cd build
$ ./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入门(二十七):因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 引用第三方库示例》

文章来源:https://blog.csdn.net/10km/article/details/135123388
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。