首页 > 其他分享 >conan 基本使用

conan 基本使用

时间:2023-12-18 13:23:23浏览次数:30  
标签:基本 cmake 1.2 -- zlib conan build 使用

原文:https://docs.conan.io/2/tutorial/consuming_packages.html

Basic

安装conan

pip install conan

打印conan依赖安装路径

conan config home

查看profile

conan profile show

install时指定profile

conan install . --build=missing --profile=default

Profile

首次安装好conan2后,需要编辑profile文件,或者使用命令生成默认配置

conan profile detect --force     

查看默认配置

conan profile path default    

配置文件内容

[settings]
arch=armv8
build_type=Release
compiler=apple-clang
compiler.cppstd=gnu17
compiler.libcxx=libc++
compiler.version=15
os=Macos

手动创建一个debug的配置

使用conan config home找到conan的目录,在conna的profile目录下新建一个配置debugfile

[settings]
arch=armv8
build_type=Debug
compiler=apple-clang
compiler.cppstd=gnu17
compiler.libcxx=libc++
compiler.version=15
os=Macos

安装时指定debugfile

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

其他方式构建debug版本

指定settings

conan install . --output-folder=build --build=missing --settings=build_type=Debug

Install zlib in conan

https://docs.conan.io/2/tutorial/consuming_packages/build_simple_cmake_project.html

创建一个Cmake项目

项目结构

.
├── CMakeLists.txt
└── src
    └── main.c

main.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <zlib.h>

int main(void) {
    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());

    return EXIT_SUCCESS;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(compressor C)

find_package(ZLIB REQUIRED)

add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

添加conanfile.txt

项目结构

.
├── CMakeLists.txt
├── conanfile.txt
└── src
    └── main.c

conanfile.txt

[requires]
zlib/1.2.11

[generators]
CMakeDeps
CMakeToolchain

构建项目

安装依赖

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

Windows

$ cd build
# assuming Visual Studio 15 2017 is your VS version and that it matches your default profile
$ cmake .. -G "Visual Studio 15 2017" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
$ cmake --build . --config Release
...
[100%] Built target compressor
$ Release\compressor.exe
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11

Linux, macOS

$ cd build
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
...
[100%] Built target compressor
$ ./compressor
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11

Read more

Specify your cmake

conanfile.txt

[requires]
zlib/1.2.11

[tool_requires]
cmake/3.22.6

[generators]
CMakeDeps
CMakeToolchain

安装依赖

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

激活环境变量以切换指定的cmake

Windows

$ cd build
$ conanbuild.bat
# conanbuild.ps1 if using Powershell

Linux, macOS

$ cd build
$ source conanbuild.sh
Capturing current environment in deactivate_conanbuildenv-release-x86_64.sh
Configuring environment variables

构建项目

Windows

# assuming Visual Studio 15 2017 is your VS version and that it matches your default profile
$ cmake .. -G "Visual Studio 15 2017" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
$ cmake --build . --config Release
...
Building with CMake version: 3.22.6
...
[100%] Built target compressor
$ Release\compressor.exe
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11

Linux, macOS

$ cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
...
Building with CMake version: 3.22.6
...
[100%] Built target compressor
$ ./compressor
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11

恢复环境

当使用脚本激活环境后,会生成一个deactivate_conanbuild.sh/bat文件用来恢复环境。

Windows

$ deactivate_conanbuild.bat

Linux, macOS

$ source deactivate_conanbuild.sh
Restoring environment

tool_requires and tool packages are intended for executable applications, like cmake or ninja. Do not use tool_requires to depend on library or library-like dependencies.

Build Release or Debug

在Release模式下会自动生成一个NDEBUG宏,在代码中可以通过这个宏来判断是Debug模式还是Release模式。

#ifdef NDEBUG
    printf("Release configuration!\n");
#else
    printf("Debug configuration!\n");
#endif

install

conan install . --output-folder=build --build=missing --settings=build_type=Debug
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug
cmake --build . --config=Debug       

修改option,使用shared方式链接外部库

通过命令行指定

conan install . --output-folder=build --build=missing --options=zlib/1.2.11:shared=True

通过conanfile.txt指定

[options]
zlib/1.2.11:shared=True

cmake中指定set(CMAKE_SKIP_RPATH TRUE)后,构建后运行会出现如下错误

Windows

$ Release\compressor.exe
(on a pop-up window) The code execution cannot proceed because zlib1.dll was not found. Reinstalling the program may fix this problem.
# This error depends on the console being used and may not always pop up.
# It could run correctly if the console gets the zlib dll from a different path.

Linux, Macos

$ ./compressor
./compressor: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

这是因为动态库文件无法加载,在Windows连接器会先找同目录下,然后是PATH里的目录; 在OSX会搜索在DYLD_LIBRARY_PATH中的路径,linux下使用的是LD_LIBRARY_PATH。

conan提供了脚本来设置运行时的环境变量。

Windows

$ conanrun.bat
$ Release\compressor.exe
Uncompressed size is: 233
Compressed size is: 147
...

Linux, macOS

$ source conanrun.sh
$ ./compressor
Uncompressed size is: 233
Compressed size is: 147
...

Conanfile

一般小型项目使用conanfile.txt就足够了,而conanfile.py会更加灵活。

conanfile.txt

[requires]
zlib/1.2.11

[tool_requires]
cmake/3.22.6

[generators]
CMakeDeps
CMakeToolchain

根据上述conanfile.txt改写conanfile.py

from conan import ConanFile

class CompressorRecipe(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeToolchain", "CMakeDeps"

    def requirements(self):
        self.requires("zlib/1.2.11")

    def build_requirements(self):
        self.tool_requires("cmake/3.22.6")

使用python来创建conan配方,首先需要创建一个继承自 ConanFile 的类,这个类有以下属性和方法:

  • settings 该类属性定义了项目范围的变量,如编译器、其版本或操作系统本身,这些变量在我们构建项目时可能会发生变化。
  • generators 该类属性指定当我们调用conan install命令时,将运行哪些Conan生成器。在上面的例子中,我们在conanfile.txt中添加了CMakeToolchain和CMakeDeps。
  • requirements() 这个方法中使用了 self.requires() 声明项目对 zlib/1.2.11的依赖。
  • build_requirements() 这个方法中使用了self.tool_requires() 声明了对 cmake/3.22.6 的依赖。

Cross-complie

省略,详情见:https://docs.conan.io/2/tutorial/consuming_packages/cross_building_with_conan.html

Versioning

Version ranges

通过conanfile.txt方式能够指定一个具体版本的依赖,如果需要升级依赖库,需要手动修改conanfile。如果使用conanfile.py,则可以更好的配置版本而不需要每次升级时手动更新。

conanfile.py

from conan import ConanFile
class CompressorRecipe(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeToolchain", "CMakeDeps"

    def requirements(self):
        self.requires("zlib/[~1.2]")

zlib/[~1.2]表示依赖的版本为1.2 ,它可能是zlib/1.2.8, zlib/1.2.11 或者 zlib/1.2.12,而不可能时zlib/1.3.0之类。在这个指定的版本范围之中,往往是最新的一个版本会被使用。

如果使用 zlib/[<1.2.12], 表明使用1.2.12之前的最后一个版本,即使用zlib/1.2.11

Lockfiles

在conanfile.py中指定了zlib依赖版本为zlib/1.2.11

def requirements(self):
    self.requires("zlib/1.2.11")

创建一个lockfile

conan lock create .

-------- Computing dependency graph ----------
Graph root
    conanfile.py: .../conanfile.py
Requirements
    zlib/1.2.11#4524fcdd41f33e8df88ece6e755a5dcc - Cache

Generated lockfile: .../conan.lock

查看 conan.lock 文件

{
    "version": "0.5",
    "requires": [
        "zlib/1.2.11#4524fcdd41f33e8df88ece6e755a5dcc%1650538915.154"
    ],
    "build_requires": [],
    "python_requires": []
}

尝试修改conanfile.py中 requires

def requirements(self):
    self.requires("zlib/[~1.2]")

运行 conan install .,conan会自动找到 conan.lock,这个命令相当于运行 conan install . --lockfile=conan.lock

conan install .

Graph root
    conanfile.py: .../conanfile.py
Requirements
    zlib/1.2.11#4524fcdd41f33e8df88ece6e755a5dcc - Cache

这样conan不再查找范围内的版本号,并且 zlib/1.2.12也不会被选中,即便它在 zlib/[~1.2]范围内, 因为 conan.lock 将版本强制锁定在了 zlib/1.2.11 和这个revision(4524fcdd41f33e8df88ece6e755a5dcc)。

标签:基本,cmake,1.2,--,zlib,conan,build,使用
From: https://www.cnblogs.com/pengpengda/p/17910972.html

相关文章

  • 统信UOS/麒麟KYLINOS上使用命令行配置NTP
    原文链接:统信UOS/麒麟KYLINOS上使用命令行配置NTPhello,大家好啊,今天我要给大家介绍的是在统信UOS/麒麟KYLINOS操作系统上使用命令行配置NTP(NetworkTimeProtocol)服务器的方法。在内网环境下,许多企业都会搭建自己的NTP服务器来确保网络中所有设备的时间同步。这对于维护网络安全、......
  • OCP接口万兆光卡转接PCIE使用心得
    最近在玩OCP万兆光卡,几十块的万兆卡,真的很香。 需要一个OCP到PCIE的转接卡,就可以在台式机上使用了。  转接卡有PCIEx8,PCIEx4,PCIEx1三种接口,参考PCIE接口规范目前常见PCIExpress版本是2.0,3.0,4.0,最新的AMD主板高端也开始支持5.0 OCP网卡单口10Gbps和双口......
  • 临时工说:阿里云的故障给使用数据库的数据库人带来影响,会给POLARDB 带来什么影响
    每日感悟:终身学习,持续减少认知的局限性,每个人的认知都局限于自己的生活的圈层和历来的过往,知识来自于书本,老师,人生经历,这些都是有限的,在优秀的人也是基于这些基础上搭建的知识体系,进行扩展,形成你的知识架构和常识,持续提高自己的认知的范围,不活在自己的小圈层,不要认为自己一定是对......
  • CH390使用注意事项
    关于CH390使用注意事项CH390替换DM90xx硬件注意事项1、CH390L替换DM9000AVDD33的对地电容建议1uF贴近芯片放置,42脚为主电源AVDD33需10uF并联0.1uF。各AVDD33需分别接电容,供电电压都为3.3V;AVDDK和DVDDK需要分别外接电容并贴近芯片放置。两个AVDDK引脚建议任选一个外接1uF,另一......
  • 数据持久层框架mybatis学习:使用mybatis+SpringBoot完成增删改查
    目录一、MyBatis的应用配置二、使用mybatis+SpringBoot完成增删改查2.1代码实现2.2增删改查接口调用一、MyBatis的应用配置依赖pom.xml注意:版本号的依赖冲突问题<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xm......
  • Windows 双网卡 配置静态路由 内外网 同时使用 一个有线 一个无线
    双网卡内网外网两个网络同时连接情况描述:Windows10电脑,支持双网卡工作工作内网,外网,需要同时使用,而不是切换网络以太网+wifi的形式,至于哪个是外网哪个是内网没有特定规定内网信息:外网信息:操作步骤管理员权限打开CMD删除默认路由前先查看一下当前路由表,免得......
  • "the tx doesn't have the correct nonce":使用hardhat调用ganache上部署的合约遇到的
    完整的报错==================>查询存证请求存证请求内容,datahash:0xaad2171441bd73b773e9a9e062753909360bdfcabbddbe93c6c58b13c5c0feaa,创建人:0xF7A1938Fecc594aaF126d46fd173cE74A659ad9A,附加信息:0x66656974757a6920616920646f756368757a69,已投票:0n,共需投票:2n==......
  • django中配置使用日志(logging)
    一、以dict的方式在setting中配置LOGGING={"version":1,#thedictConfigformatversion"disable_existing_loggers":False,#retainthedefaultloggers"formatters":{"standard":{#日志输出格式配置......
  • 【虹科分享】使用Allegro网络万用表进行网络分析
    文章速览:Allegro网络万用表在公用事业公司的应用领域Allegro网络万用表VS.WiresharkAllegro200和Allegro500:作为标准配置传统企业成为互联网服务提供商,如何利用数字工具实现现代化转型?本期文章,我们分享一家国外的公共事业公司的现代化转型故事。StadtwerkeUnnaGmbH,,是......
  • 5款不可或缺的办公软件,好用且使用频率超高,几乎每个人都需要
    在当今数字化时代,办公软件成为了现代职场必备的工具。这些软件可以大大提高我们的办公效率,简化工作流程,使我们更加高效地完成任务。今天给大家分享5款不可或缺的办公软件,它们不仅好用,而且使用频率极高,几乎每个人都需要。 01、AnytxtSearcher(文档内容搜索神器) AnytxtSearch......