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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

对于新一代的编程语言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

三、编译时使用依赖库

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

之前的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下载的库的。

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++