今天得好好说道说道这个叫Conan的玩意儿。可把我给折腾过,也确实帮了我大忙。
最早接触C++那会儿,项目一大,依赖库就跟蜘蛛网似的,一个缠一个。那时候我还是个小年轻,每次配环境、换电脑,或者新同事加入,那简直就是一场灾难。缺这个头文件,少那个链接库,编译一报错就是几十上百个,看得人头皮发麻。尤其是搞跨平台,Windows下一套,Linux下一套,还得自己手动去下载源码,一个个编译,参数稍微错一点就得重来,那段时间加班加点,净跟这些破事儿较劲了。
噩梦的开始与转机
记得有一次,接了个挺急的项目,里面要用到好几个开源库,什么图像处理的、网络通信的、还有个啥加密的。光是把这些库在不同系统上编译通过,就花了我快一个礼拜。好不容易弄完了,客户那边环境一变,说要换个编译器版本,或者某个库要升级个小版本,得,又得从头来一遍。当时我就在想,这活儿啥时候是个头,难道C++就活该这么苦逼吗?
后来也是偶然,在网上瞎逛,看人家讨论C++的包管理。当时我就愣了,C++还有包管理?之前用过Python的pip,Java的Maven,那叫一个爽。我就抱着试试看的心态,搜了搜,就看到了Conan。一开始也没报太大希望,毕竟C++这摊子水太深了。
我的Conan折腾记录
说干就干,我先是把Conan给装上了。这步倒还挺顺利,pip装一下就行。然后我就开始看文档,学着怎么用。
第一步,是写那个叫`*`或者`*`的文件。我就照着葫芦画瓢,把项目里用到的库,比如`zlib/1.2.11`,`openssl/1.1.1k`这些,一个个写进去。心里还犯嘀咕,这玩意儿能找到吗?不会又是一堆坑。
然后我就执行了`conan install`命令。看着命令行里刷刷刷地开始下载东西,编译东西,还真像那么回事儿!有些库它直接就有预编译好的二进制包,那就很快。有些可能没有,它就尝试从源码编译,虽然慢点,但至少它在动!
也不是一帆风顺。遇到过几次麻烦事儿:
- 找不到想要的包版本:有时候我想用的特定版本,官方源里没有,或者配置不太对。这时候就得自己去网上找人家分享的方子(recipe),或者硬着头皮自己改人家的方子,然后自己`conan export`一下,搞个本地的。
- 编译选项冲突:比如一个库依赖另一个库,但它们对某个编译选项(比如MT/MD,Debug/Release)的要求不一样,这就头疼了。得仔细看Conan的profile配置,还有各个包的options,慢慢调。记得有一次为了一个选项,我跟它耗了一下午。
- 跟现有构建系统的集成:我们项目用的是CMake。Conan倒是提供了CMake的生成器,比如`cmake_find_package`或者`cmake_paths`。一开始用的时候,总感觉生成的路径有点怪,或者`find_package`找不到。后来多试了几次,仔细看了看Conan生成的`*`文件,才慢慢摸索明白怎么在`*`里正确包含和链接这些库。这块儿一开始挺劝退的。
柳暗花明
就这么折腾了几天,把项目里的依赖一个个都用Conan给管起来了。当我第一次在新电脑上,只用几条命令就把整个项目的依赖全部搞定,并且顺利编译通过的时候,那感觉,简直了! 以前可能要折腾一两天的活儿,现在十几分钟,甚至几分钟就搞定了。再也不用手动下载、解压、配置、编译了。
后来我们团队也慢慢开始推广用Conan。新同事来了,直接`git clone`代码,然后`conan install`,再`cmake`编译,一套流程下来,特别顺畅。大大减少了环境配置上的时间和精力浪费。
现在回想起来,虽然刚开始学Conan的时候也踩了不少坑,查了不少资料,但一旦把它用顺了,那效率提升是真的明显。尤其是对于C++这种“依赖地狱”来说,有个靠谱的包管理器,简直就是救星。 Conan也不是完美的,有时候找一些冷门库或者特定配置的包还是挺费劲,但它已经帮我解决了很多头疼的问题了。
如果你也在被C++的依赖管理搞得焦头烂额,不妨花点时间去试试Conan这玩意儿。前期可能需要点耐心去学习和配置,但相信我,后面你会感谢自己的。
还没有评论,来说两句吧...