Conan中的C/C++的依赖管理

2023-01-12 624阅读

温馨提示:这篇文章已超过441天没有更新,请注意相关的内容是否还可用!

对于新一代的编程语言Java、Python,当编译、运行时需要第三方的库,可以用语言自带的工具,下载这些依赖库,级联依赖的库也会被下载,部署时也会去下载或者用之前下载的。

而C/C++编译、运行时,可以链接操作系统里的动态库,这些库的下载需要手工执行yum,部署时也需要这样安装依赖库。

C/C++与Java、Python都有库依赖问题,但是C/C++语言没有自带的包管理机制,也许是因为C/C++更多的应用于系统程序领域,Java、Python更多用于应用程序领域,对快速开发和部署要求更高。

不过现在逐渐进化出C/C++的依赖管理工具,C/C++的编译部署也可以像Java、Python那样。

这个工具就是conan,当然还有别的C/C++依赖管理工具,不过我试用了一下conan,还是挺好用的。

下面用Getting Started — conan 1.56.0 documentation

的例子说明,这个例子编译一个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;
 }

这个程序用到了poco/1.9.4这个库,我们的方法是用conan下载,然后用cmake编译。

一、下载conan

这个conan是个Python3程序,它的获取可以通过pip install,例如:

pip install conan

二、下载/安装C/C++依赖库

当我们要编译的C/C++程序需要依赖某个库时,有了conan的包管理,不再需要在操作系统上用yum安装了,而是用conan install命令,这个命令会寻找conanfile.txt,然后安装里面指定的库:

[requires] poco/1.9.4

[generators] cmake

 [requires]段指定要安装的库/包的名称,[generators]指定为哪编译工具生成配置文件,这里生成cmake的配置文件,其中包括编译时使用这些库的编译选项。

然后在conanfile.txt所在目录下执行

conan install .

这一步生成了conanbuildinfo.cmake

三、编译时使用依赖库

如何在编译时使用之前下载的依赖库呢&#xff1f;

之前的conan install,在下载了依赖库时,也创建了cmake配置,只要把这些配置添加到cmake工程中,就可以在编译时使用这些依赖库了。

例如,创建CMakeLists.txt,内容如下:

 cmake_minimum_required(VERSION 2.8.12)
 project(MD5Encrypter)

 add_definitions("-std=c++11")

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

 add_executable(md5 md5.cpp)
 target_link_libraries(md5 ${CONAN_LIBS})

对于版本大于5.1的GCC编译器,执行下面的命令,否则连接时会出错:

conan profile new default --detect  # Generates default profile detecting GCC and sets old ABI
conan profile update settings.compiler.libcxx=libstdc++11 default

然后在CMakeLists.txt所在目录,执行:

cmake .

make

在bin目录下生成md5可执行文件,这个可执行的文件是静态链接poco库的,用这种方法编译的可执行文件都是静态链接conan下载的库的。