龙空技术网

C++包管理器Conan使用笔记

警惕数字用户 418

前言:

今天小伙伴们对“python调用clib”可能比较重视,兄弟们都需要了解一些“python调用clib”的相关内容。那么小编也在网络上汇集了一些有关“python调用clib””的相关资讯,希望小伙伴们能喜欢,我们一起来学习一下吧!

前言

前不久就想总结一下这段时间使用conan的心得和总结,在以前我还不知道C++也有包管理工具,后来接触了前端和python感觉他们的npm和pip都很方便,直到前几天,学习rust的时候感觉它的cargo很是方便,才打算上谷歌搜索一下C++有没有包管理器,说来也惭愧,其实微软在很早之前就发布了一款名为vcpkg的包管理器,拿来试了一下,感觉网络有很大的问题啊,下载速度简直慢到怀疑人生。再后来接触到conan感觉自己又行了,接下来,我会分享一下conan的使用和一些体会,也算是一个总结吧。开始吧!

什么是包管理器?

包管理器又称软件包管理系统,它是在电脑中自动安装、配制、卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用

有哪些工具可以用?

clib – C编程语言的软件包管理器 [MIT]

Conan – C/C++程序包管理器,开源。[MIT]

CPM – 基于CMake和Git的C++程序包管理器。

Hunter – CMake的为C ++驱动的跨平台的包管理器。[BSD-2]

SW – 跨平台的C++(和其他语言)构建系统和程序包管理器,其中包含许多可用的程序包。[GPLv3]

Vcpkg – 适用于Windows,Linux和MacOS的C ++库管理器。[MIT]

XMake – 基于Lua的AC / C ++跨平台构建实用程序。[Apache]

不用工具,怎么管理?

对于我而言,之前在没有接触包管理工具的时候管理三方库非常的艰难,如果官方没有提供二进制文件需要自己下载源代码进行编译(像boost那样的重量级库,如果要自己编译简直想哭),然后自己去管理二进制文件。如下图:

手动管理第三方依赖

如果你所使用的第三方库还依赖另一些三方库,那么痛苦还得加倍,如下图:(这是我们下面将要使用的一个库)

POCO库本身依赖的第三方库

为什么是Conan?

综上,其实了解一下C++的包管理器还是挺多的了,在这里就不展开讨论他们之间有什么区别,我也不想聊什么生态啊,兼容啊什么的,可以直接上链接去看看某乎上的回答:。

区别就不讨论了,但是仍然要说一下为什么要选择conan,上面的列表我只了解过conan、vcpkg、xmake,值得一提的是,xmake貌似是国人开发的一款集包管理、构建于一身的工具,但是上官网可以发现,软件是免费的,但是教程要收费,还不便宜,就放弃了。vcpkg是微软开源的一款C++包管理器,国内应该是使用的最多的了,目前所管理的库也是挺多的了,但是缺点也很明显,库文件下载时网络实在是很慢(我是常年挂的梯子)有人说开代理可以解决,不想折腾了,并且不支持自建仓库,如果他的仓库里面没有需要的库那就需要自己去管理了。再一个就是conan,在下载的时候网络基本没有问题,下载速度挺快的。而且支持自建仓库,就算官方的仓库没有我们需要的库我们也能自己去创建。这就是为什么选择conan的原因了。

Hello World !

说了这么多废话,下面就可以开始实战了。安装过程就不过多介绍了,直接上官网下载安装包进行安装,Linux系统最好通过python的pip进行安装。请记住,有问题多去查一下官方的文档,conan的官方文档写得还是很清楚的。

首先创建一个名为conan的C++项目,在项目根目录里面创建一个名为conanfile.txt的文件,在文件开头输入[requires]表示项目的依赖列表,我们使用官方的例子,通过使用poco库的md5加密一段字符串。文件创建完成之后,我们去conan-center查一下poco库搜索框输入poco,会列出关键字的库,点击poco如下图:

conan-center中poco界面

默认是最新版本的当前最新版本为1.10.1,可以通过下面的Version下拉框选择需要的版本,点击poco/1.10.1旁边的复制按钮,将复制的文本粘贴到conanfile.txt里面,我们还需要定义构建工具,这里使用CMake作为构建工具,如下:

[requires]poco/1.10.1[generators]cmake

打开控制台,定位到项目的构建目录(并非根目录)我这里是build-debug 输入安装命令conan install ..开始安装库文件:如果没有错误信息说明库文件安装成功了,可以开始使用了,输入代码:

#include "Poco/MD5Engine.h"#include "Poco/DigestStream.h"#include <iostream>int main(int argc, char** argv){    Poco::MD5Engine md5;    Poco::DigestOutputStream ds(md5);    ds << "Hello World !";    ds.close();    std::cout << Poco::DigestEngine::digestToHex(md5.digest()) << std::endl;    return 0;}

Conan安装了我们的Poco依赖关系,还安装了它的传递依赖关系:OpenSSL,zlib,sqlite等。它还为我们的构建系统生成了conanbuildinfo.cmake文件。

构建、编译、发现编译错误:

无法打开包括文件: “Poco/MD5Engine.h”: No such file or directory

这里需要注入柯南信息,请包含生成的conanbuildinfo.cmake文件,在CMakeLists.txt里面输入:

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)conan_basic_setup()target_link_libraries(conan ${CONAN_LIBS})

构建、编译、发现编译还有错误:

error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”

这是因为我们使用的是debug模式,但是conan默认下载的是release模式的库文件,这个时候我们需要指定构建模式为debug,回到安装命令重新运行conan install .. -s build_type=Debug,通过-s标志进行设置build_type为构建类型,这里可选None, Debug, Release, RelWithDebInfo, MinSizeRel,我们选择的Debug,安装命令运行成功后,继续构建、编译、运行。此时输出:b9be3ef4018be19f248f6f8e63b9e006,表示运行成功了。工程的将Hello World !用md5加密了。

上面是一个很简单的例子,通过这个例子可以看到conan的使用非常的方便,简单的几句命令就可以管理我们的库文件。是不是很方便呢?上面通过conan-center进行库的查询其实也可以用命令查询,不过有界面还是很直观的。打开命令行输入conan search poco可以直接通过命令行去查询需要的库。有时我们需要查看库文件的元数据,可以通过conan inspect poco/1.10.1命令查询库文件的元数据

要检查当前项目的所有依赖项,请使用conan info命令,将其指向conanfile.txt文件夹的位置 。或使用Dot或HTML格式生成依赖关系图:conan info .. --graph=file.html

更多命令可以使用conan --help查看,或者去conan的官方文档去查一下。

使用其他配置

conan在安装完成后会生成一些默认配置,比如上面提到的构建类型默认为debug,我们可以在conanfile.txt指定其他的配置,这样可以简化命令。但是在这之前我们需要通过命令来了解一下其他的配置怎么设置,这样在后面会容易理解一些。

经常在windows下开发的朋友们可能知道,C++库通常分为动态链接库和静态链接库,那么通过conan怎么来实现呢?继续上面的例子,运行命令conan install .. -o poco:shared=True 或conan install .. --options poco:shared=True修改True为False就是静态链接库(conan默认为静态链接库),甚至还可以通过通配符conan install .. -o *:shared=True对所有依赖的库使用动态链接库。

conan的默认配置文件通常会在用户目录下面,Windows大概为:C:/Users/<username>/.conan/profiles/default。Linux大概为/home/<user>/.conan/profiles/default,可以打开文件看看结构,我们可以看到所有的标志在配置文件里面都是一个配置组(-o或者–options其实就是配置文件里面的[options]组),我们可以新建一个属于自己系统环境的配置文件,但是需要注意的是在安装的时候需要指定我们自己的配置文件,比如我有一个名为gcc_x86的配置文件,那么命令应该是conan install .. --profile=gcc_x86 但是,用户始终可以使用--settings或-s标志进行覆盖,如:

conan install .. --settings arch=x86

最后一个问题,如果我们将配置全部写进命令里面那么命令将会变得很长如:

conan install .. -o *shared=True -s build_type=Debug -s arch=x86

这样并不友好,不可能每次都要输入这么多,这样可能也不便于记忆,我们可以选择上面介绍的方法,自己在.conan/profiles/文件夹里面创建一个自己环境的配置文件然后通过--profiles标志指定配置文件,但如果我们的项目多了这样也会成为问题,那么更好的办法就是把配置写进conanfile.txt里面(settings除外),根据项目的需求来进行配置,例如:

[requires]poco/1.10.1boost/1.75.0[generators]cmake[options]*:shared=True[imports]bin, *.dll -> ./bin

看到这儿,是不是有个疑问?imports组是干什么的呢?这个是用来导入程序运行所需要的组件,比如常见的动态链接库是由若干个.dll后缀文件的组成的,那么我们在发行的时候是需要将这些dll文件随着程序一起发布的,那么这里就是用来复制这些文件的,这里定义了从库文件的bin文件夹,将后缀为.dll的文件拷贝到当前项目的bin文件夹。

写在最后

通过这段时间接触了C++的包管理的概念,也理解了C++对于包管理的难处,对于C++而言其实包管理一直是一个“老大难”的问题,因为这里面需要和各个厂商的各种版本的平台、各种架构、和各种编译器以及构建工具之间的博弈使得C++包管理难度相当大,C++20出来了,里面也有了包的概念但是等官方或者三方的包管理工具可能仍然需要很长一段时间,conan并不是最好的选择,他也有许多的坑,但是我用得最习惯的工具,仅此而已。接下来我还要写一篇打包一个开源库并且使用Jenkins进行自动构建的文章。总之,C++还有很长的路要走,对于我自己而言C++这条路也还有很长,加油!

2021年3月2日 农历正月十九

转载自:

标签: #python调用clib #vc调用lua #win10无法定位pocodll