使用conan管理你的项目,优雅的进行依赖和模块的管理(一)
写在前面,为什么要引入包管理工具
-
作为一名大龄码农,从一开始在linux下手写原生的makefile,到automake、xmake、cmake等工具的盛行,也算经历过了各式各样的项目构建过程,有接触过几分钟构建完成的小巧项目,也经历过每次构建都花费几个小时的巨无霸项目,自己也亲手搭建过或手写过一些自动化构建脚本,这些大多数是基于本地的自动化生成或构建脚本。
-
每次新项目启动时,还是避免不了在项目前期需要花费大量的时间去搭建工程框架;并且项目需要用到的模块,几乎都是源码方式引入,最后进行对整个项目以及它依赖的工程,进行源码编译打包发布。偶尔遇到过一些三方库比较大(如QT、ssl等),会进行拆分、预先编译好,然后根据需要引用不同版本,但也仅仅是对库进行了预先编译,使用方式依旧是通过手动拷贝的方式去引用,人肉的去管理库的依赖和版本,一旦拷贝库的版本不正确,很容易导致出问题(比如编译失败或运行时兼容问题)。
-
如果你现在的工程遇到下面的这些问题,那么conan将对你非常有用
- 大型工程 - 代码模块、文件、行数非常多,工程只靠人肉管理和口口相传又或者通过wiki等文档管理。
- 应用二进制接口不兼容 - 为了确保一个库与其他库、整个应用的兼容性,必须在通过各种配置来描述具体依赖信息,比如操作系统、架构和编译器等。
- 编译构建慢 - 由于头文件包含和预处理,以及上面提到的这些挑战,需要额外的机制来提升编译效率,保证只编译那些需要重新编译的代码。
- 代码链接和内嵌 - 一个静态的C/C++库能够被另一个库通过头文件包含的方式引用。一个共享库也能嵌入一个静态库。以上两种情形,任何依赖变更时,都必须管理哪些库是需要重新构建的。
conan是什么
Conan is a dependency and package manager for C and C++ languages. It is free and open-source, and it works in all platforms: Windows, Linux, OSX, FreeBSD, Solaris, etc. and can be used to develop for all targets including embedded, mobile (iOS, Android), bare metal. It also integrates with all build systems like CMake, Visual Studio (MSBuild), Makefiles, SCons, etc., including proprietary ones.
以上是conan官网对它的描述,简单来说,它是一款c、c++的包管理工具,并且可以支持全平台(如windows、linux、mac、ios、android以及嵌入式系统等)和所有构建系统。
conan如何工作的
- 引用一张网友整理的图,里面也有关于conan和jinkens做持续交付的方案,感兴趣的同学可以看看 https://blog.csdn.net/afandaafandaafanda/article/details/82717246
环境要求
- python3.5 及以上版本
安装
-
安装python3 https://www.runoob.com/python3/python3-install.html
-
通过pip安装conan
$ pip install conan
-
创建目录存放自己的工程
$ mkdir conan_demo & cd conan_demo
-
在新目录下创建一个简单的cmake代码工程,其中conanfile.txt是conan用于管理包依赖和构建系统的文件,有点类似于Cmake当中的cmakelists.txt
-CMakeLists.txt
-md5.cpp
-conanfile.txt
- md5.cpp
#include "Poco/MD5Engine.h"
#include "Poco/DigestStream.h"
#include <iostream>
int main(int argc, char** argv)
{
Poco::MD5Engine md5;
Poco::DigestOutputStream ds(md5);
ds << "abcdefghijklmnopqrstuvwxyz";
ds.close();
std::cout << Poco::DigestEngine::digestToHex(md5.digest()) << std::endl;
return 0;
}
2.cmakelist.txt
cmake_minimum_required(VERSION 2.8.12)
if(CMAKE_VERSION VERSION_LESS 3.0.0)
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-std=c++11 COMPILER_SUPPORTS_CXX11)
check_cxx_compiler_flag(-std=c++0x COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
endif()
else()
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
project(MD5Encrypter)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(md5 md5.cpp)
target_link_libraries(md5 ${CONAN_LIBS})
cmakelists.txt的编写和正常写cmake一样,其中最重要的两句是,通过这两句将conan引入到cmake的构建系统中使用
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
3.conanfile.txt
[requires]
poco/1.9.4
[generators]
cmake
其中 [requires]代表本工程需要依赖的模块(在此处是poco这个三方库)以及相应的版本号,[generators]表示conan使用哪种构建系统
- 构建代码
mkdir build & cd build conan install .. cmake .. & msbuild /m MD5Encrypter.sln
以上就是一个客户端通过conan管理自己工程的简单例子,这个工程引用了poco这个库,并且可以根据我们的需要,指定依赖的poco的版本号。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?