conan2 基础入门(03)-使用(msvc为例)

news2024/11/16 8:49:18

conan2 基础入门(03)-使用(msvc为例)

文章目录

  • conan2 基础入门(03)-使用(msvc为例)
  • ⭐准备
    • 生成`profile`文件
    • 预备文件和Code
  • ⭐使用
    • 指令预览
    • 正确执行结果
    • 可能出现的问题
  • ⭐具体讲解
    • conan
      • conanfile.txt
      • 执行 install
    • cmake
      • CMakeLists.txt
      • 生成项目
      • 构建
  • END

⭐准备

在阅读和学习本文前,希望有一定的cmake基础。

cmake基础:

(CMake) 从下载到构建第一个CMake应用

(CMake) 库的生成和链接

Build a simple CMake project using Conan — conan 2.3.0 documentation

在conan官网中有简单的示例教程。

在这里插入图片描述

生成profile文件

在使用conan前,需要先准备一个profile文件。下面指令会自动生成默认的。

# 生成默认profile文件,名字为`default`
# --force 表示强制生成,即若原来有`default`会被覆盖
# --name 表示指定生成名称
conan profile detect
conan profile detect --force
conan profile detect --name <指定名称>

# 查看名为`default`的profile文件的路径
conan profile path default
conan profile path <名称>

# 查看已经存在的eprofile
conan profile list

在笔者测试机(装有vs2019)上会出现如下显示。其实就是一个.ini格式的配置文件(但并非完全的ini,conan有自己的特殊处理)。

detect_api: Found msvc 16

Detected profile:
[settings]
arch=x86_64
build_type=Release
compiler=msvc
compiler.cppstd=14
compiler.runtime=dynamic
compiler.version=192
os=Windows

WARN: This profile is a guess of your environment, please check it.
WARN: The output of this command is not guaranteed to be stable and can change in future Conan versions.
WARN: Use your own profile files for stability.
Saving detected profile to C:\Users\lotus\.conan2\profiles\default
C:.
│  global.conf
│  settings.yml
│  version.txt
│
├─extensions
│  └─plugins
│      │  profile.py
│      │
│      └─compatibility
│              compatibility.py
│              cppstd_compat.py
│
└─profiles
        default

在这里插入图片描述

预备文件和Code

文件名预览

:.
│  CMakeLists.txt
│  conanfile.txt
└─ main.cpp

main.cpp

#include <iostream>

#include "zlib.h"

void test_env() {
    std::cout << ">>>" << __func__ << std::endl;
    std::cout << "sizeof(void*) = " << sizeof(void *) << std::endl;
#if defined(__VERSION__)
    std::cout << "__VERSION__ = " << __VERSION__ << std::endl;
#elif defined(_MSC_VER)
    std::cout << "_MSC_VER = " << _MSC_VER << std::endl;
#endif
}

void test_zlib(void) {
    std::cout << ">>>" << __func__ << std::endl;

    char buffer_in[256] = {
        "Conan is a MIT-licensed, Open Source package manager for C and C++ development"
        "for C and C++ development, allowing development teams to easily and efficiently"
        "manage their packages and dependencies across platforms and build systems."};
    char buffer_out[256] = {0};

    z_stream defstream;
    defstream.zalloc    = Z_NULL;
    defstream.zfree     = Z_NULL;
    defstream.opaque    = Z_NULL;
    defstream.avail_in  = (uInt)strlen(buffer_in);
    defstream.next_in   = (Bytef *)buffer_in;
    defstream.avail_out = (uInt)sizeof(buffer_out);
    defstream.next_out  = (Bytef *)buffer_out;
    deflateInit(&defstream, Z_BEST_COMPRESSION);
    deflate(&defstream, Z_FINISH);
    deflateEnd(&defstream);

    printf("Uncompressed size is: %lu\n", strlen(buffer_in));
    printf("Compressed size is: %lu\n", strlen(buffer_out));
    printf("ZLIB VERSION: %s\n", zlibVersion());
}

int main(void) {
    test_env();
    test_zlib();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(mydemo CXX)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

find_package(ZLIB REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

conanfile.txt

[requires]
zlib/1.3.1

[generators]
CMakeDeps
CMakeToolchain

⭐使用

指令预览

流程化指令,run.bat

如果你和上文中的代码和配置文件编写一致,请无脑直接操作以下命令。

conan install . --output-folder=build --build=missing

cd build

cmake .. -G "Visual Studio 16 2019" -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake"

cmake --build . --config Release

cd ../bin/Release

mydemo.exe

正确执行结果

如果操作都没问题,则会出现下面的结果。

生成一个CMakeUserPresets.json文件,buildbin文件夹。并成功生成可执行文件mydemo.exe文件。

在这里插入图片描述

# mydemo.exe 执行结果
>>>test_env
sizeof(void*) = 8
_MSC_VER = 1929
>>>test_zlib
Uncompressed size is: 231
Compressed size is: 19
ZLIB VERSION: 1.3.1

可能出现的问题

下面讲一些可能出现的问题,因为笔者是比较顺利的完成的,这里将的都是一些基于经验的猜测。

  • 没有正确配置好conan环境
  • 没有生成profile文件
  • profile-default中的配置版本太低,无法正常支持本文示例中的库
  • profile文件中的配置与cmake指令中的配置不一致
    • 如指定编译器不同
    • 指定debug还是release模式不同
  • 相关路径错误
  • 你使用的环境与笔者不同,而你直接cv笔者的环境,指定代码等

关于cmake指定编译器,可以通过help指令查看,一般在Generators下,前面有*的是cmake下的默认编译器。

(CMake) 指定生成器 generator

cmake --help
...
...
Generators

The following generators are available on this platform (* marks default):
  Visual Studio 17 2022        = Generates Visual Studio 2022 project files.
                                 Use -A option to specify architecture.
* Visual Studio 16 2019        = Generates Visual Studio 2019 project files.
                                 Use -A option to specify architecture.
  Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                 Optional [arch] can be "Win64" or "ARM".
...
...

⭐具体讲解

关于上文中,文件和代码配置的相关信息可以参照官网的提示编写。

zlib - Conan 2.0: C and C++ Open Source Package Manager

在这里插入图片描述

conan

conanfile.txt

[requires]
zlib/1.3.1

[generators]
CMakeDeps
CMakeToolchain

[requires]

section is where we declare the libraries we want to use in the project

表示需要获取的库。

我们可以在官网查看是否有该包,和包的版本。也可以通过search指令来查看。

# conan search <库名>
conan search zlib

Found 6 pkg/version recipes matching zlib in conancenter
conancenter
  zlib
    zlib/1.2.8
    zlib/1.2.11
    zlib/1.2.12
    zlib/1.2.13
    zlib/1.3
    zlib/1.3.1

[generators]

section tells Conan to generate the files that the compilers or build systems will use to find the dependencies and build the project.

In this case, as our project is based in CMake, we will use CMakeDeps to generate information about where the Zlib library files are installed and CMakeToolchain to pass build information to CMake using a CMake toolchain file.

用于告诉conan编译或构建当前项目所需要的依赖。

CMakeDeps:生成关于Zlib库文件安装位置的信息

CMakeToolchain:传递构建信息到CMake使用CMake工具链文件。

简单说这就是为了配合cmake使用。

执行 install

conan install . --output-folder=build --build=missing
  • --output-folder=build 表示conan的生成文件放置的目录。
  • --build=missing 表示conan在安装过程中构建任何缺失的依赖项。

该指令会自动根据profile文件安装下载conanfile.txt指定的库。并生成build文件夹。具体的还会生成CMakeUserPresets.json文件,不过这个不是重点。

具体的,执行完后会出现下列文件。

可见却是针对zlib库做了很多对应的操作,而其中最重要的是名为conan_toolchain.cmake的文件。

在这里插入图片描述

而实际的zlib库则是下载到.conan2/p文件夹中。(注意,在默认生成的profile中是下载的静态库)

在这里插入图片描述

如果你只是单纯的下载一个库,到这里其实就可以结束了。

cmake

而接下来都是cmake的操作了。

CMakeLists.txt

下面看两个cmake的重点语句。

find_package(ZLIB REQUIRED)

target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

其实在上文已经提到,在官网中正对ZILB库要求分别这样写查找方式和链接方式

在这里插入图片描述

生成项目

关于指定编译器问题,已经上面提到了。

这里的重点在于指定cmake_工具链_文件也就是上面提到的conan_toolchain.cmake

cmake .. -G "Visual Studio 16 2019" -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake"

conan_toolchain.cmake

我们查看以下该文件,可以看到下面的重要信息。

可见,这里自动帮我们找到了对应库的头文件和库文件。

# ...

# Definition of CMAKE_PREFIX_PATH, CMAKE_XXXXX_PATH
# The Conan local "generators" folder, where this toolchain is saved.
list(PREPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_LIST_DIR} )
list(PREPEND CMAKE_LIBRARY_PATH "C:/Users/lotus/.conan2/p/zlibbe5a5af71d5cc/p/lib")
list(PREPEND CMAKE_INCLUDE_PATH "C:/Users/lotus/.conan2/p/zlibbe5a5af71d5cc/p/include")

# ...

对应的实际文件为:

在这里插入图片描述

构建

该操作很简单,就是注意下和profile文件中指定的是否是一致的release/debug。

cmake --build . --config Release

至此,就生成了我们的目标可执行文件。




END

辅助脚本

@REM 辅助清除脚本

del CMakeUserPresets.json

rmdir /s /q build

rmdir /s /q bin

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1665694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot集成Netflix-ribbon、Enreka实现负载均衡-12

Netflix Ribbon简介 Netflix Ribbon是Netflix发布的云中间层服务开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。 具体来说&#xff0c;Ribbon是一个客户端负载均衡器&#xff0c;可以在配置文件中列出所有的服务…

力扣例题(循环队列)

链接 . - 力扣&#xff08;LeetCode&#xff09; 描述 思路 我们使用数组来创建循环队列 数组的大小我们就额外对开辟一块空间 MyCircularQueue(k) 开辟一个结构体&#xff0c;存放队列的相关数据 分别为size,数组指针_a,起始位置head,结束位置tail 注意&#xff1a;我们…

【harbor】harbor的搭建与使用

harbor的搭建与使用 文章目录 harbor的搭建与使用1. harbor的下载2. 创建ssl证书3.harbor的配置3. docker修改4.启动harbor5.使用docker总结 1. harbor的下载 harbor仓库地址&#xff1a;https://github.com/goharbor/harbor harbor主要是go语言写的&#xff0c;但是我们dock…

Docker停止不了

报错信息 意思是&#xff0c;docker.socket可能也会把docker服务启动起来 解决 检查服务状态 systemctl status dockersystemctl is-enabled docker停止docker.socket systemctl stop docker.socket停止docker systemctl stop docker知识扩展 安装了docker后&#xff0c;…

计算机字符集产生的历史与乱码

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

python数据分析——pandas数据结构2

参考资料&#xff1a;活用pandas库 导入基础数据 # 导入库 import pandas as pd # 读取数据集 dfpd.read_csv(r"..\data\scientists.csv") df.head() 1、DataFrame DataFrame是Pandas中最常见的对象。可以把它看作python存储电子表格式数据的方式。Series数据结构…

PMOS和NMOS

一. MOS管简介 MOS管是场效应管的一种&#xff0c;主要有两种结构形式&#xff1a;N沟道和P沟道&#xff0c;又根据场效应原理的不同&#xff0c;分为耗尽型&#xff08;当栅压为零时有较大漏极电流&#xff09;和增强型&#xff08;当栅压为零&#xff0c;漏极电流也为零&…

Jenkins 备份恢复插件 ThinBackup

系统环境&#xff1a; Jenkins 版本&#xff1a;2.213 一、简介 在部署完 Jenkins 后首先要准备的就是数据备份问题&#xff0c;尤其是在生产环境下的 Jenkins&#xff0c;如果数据丢失很可能导致项目上线和开发时间受到影响&#xff0c;所以备份数据很重要。还好&#xff0c;…

[算法][差分数组][leetcode]1094. 拼车

地址&#xff1a; https://leetcode.cn/problems/car-pooling/description/ 解法一&#xff1a;暴力解法 class Solution {public boolean carPooling(int[][] trips, int capacity) {//特殊条件判断if(nulltrips||capacity<0){return false;}int [] d new int[1001];//暴…

VTK官方例子

VTK官方例子 vtkMutableDirectedGraph #!/usr/bin/env python# noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkName…

数组二叉树-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 二叉树也可以用数组来存储&#xff0c;给定一个数组&#xff…

信息系统项目管理师0103:初步可行性研究(7项目立项管理—7.2项目可行性研究—7.2.2初步可行性研究)

点击查看专栏目录 文章目录 7.2.2初步可行性研究1.初步可行性研究定义2.辅助研究的目的和作用3.初步可行性研究的作用4.初步可行性研究的主要内容记忆要点总结7.2.2初步可行性研究 1.初步可行性研究定义 初步可行性研究一般是在对市场或者客户情况进行调查后,对项目进行的初步…

linux上使用mariadb安装mysql环境

之前都是手动安装mysql数据库&#xff0c;现在尝试下在线安装&#xff0c;为后面的项目部署做准备&#xff0c;突然发现使用mariadb安装mysql环境真的超级简单。 1.使用mariadb安装mysql 安装服务端&#xff1a; yum install mariadb-server -y 安装客户端&#xff1a; yum i…

大数据Scala教程从入门到精通第六篇:Scala编译结果反编译分析

一&#xff1a;Scala编译结果反编译分析 问题&#xff1a;为什么Scalac之后的生成的class文件有两个&#xff0c;一个带$的&#xff0c;一个不带$的&#xff1f; 不能直接java 执行scala编译的字节码文件。 直接运行的话就会报错&#xff0c;会报一个类没有被找到。 引入类库就…

【全面介绍下Spring】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Excel中实现md5加密

1.注意事项 (1)在Microsoft Excel上操作 (2)使用完&#xff0c;建议修改的配置全部还原&#xff0c;防止有风险。 2.准备MD5宏插件 MD5加密宏插件放置到F盘下&#xff08;直接F盘下&#xff0c;不用放到具体某一个文件夹下&#xff09; 提示&#xff1a;文件在文章顶部&…

JCR一区 | Matlab实现TTAO-CNN-BiLSTM-MATT多特征分类预测

JCR一区 | Matlab实现TTAO-CNN-BiLSTM-MATT多特征分类预测 目录 JCR一区 | Matlab实现TTAO-CNN-BiLSTM-MATT多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现TTAO-CNN-BiLSTM-MATT三角拓扑聚合优化器优化双向长短期记忆神经网络融合多头注意力…

JAVA 标准接口返回与i18n国际化配置

不喜欢废话直接上代码 标准通用返回 package com.luojie.common;import com.luojie.common.inter.ResponseCommon; import lombok.Data;Data public class ResponseCommonImpl implements ResponseCommon {int code;String msg;Object entity; }package com.luojie.common;im…

苹果电脑MAC清理系统空间工具CleanMyMacX4.15.3中文版下载

苹果电脑以其出色的性能、优雅的设计和高效的操作系统而受到许多用户的喜爱。然而&#xff0c;随着时间的推移和使用量的增加&#xff0c;你可能会发现你的Mac开始变得缓慢和响应迟缓。这通常是因为硬盘空间被大量占用&#xff0c;影响了系统的整体性能。幸运的是&#xff0c;有…

白话机器学习4:小波分解的原理与Python代码实现

小波去噪可以想象成使用一把“筛子”来过滤信号。这个“筛子”能够根据信号的不同频率成分&#xff0c;将其分解成多个层次。在这个过程中&#xff0c;信号的重要信息通常包含在低频部分&#xff0c;而噪声则多分布在高频部分。 将信号通过这个“筛子”分解后&#xff0c;我们可…