目录
- 1 什么是Conan?
- 2 Conan安装与配置
- 3 Conan的常见操作
- 3.1 搜索指定包
- 3.2 安装指定包
- 3.3 本地包管理
- 3.4 查看项目依赖
- 4 Conan构建项目案例
1 什么是Conan?
Conan
是一个开源的C/C++包管理器,用于管理和构建C/C++项目所需的依赖库。传统上,C/C++项目的依赖项管理比较繁琐,需要手动下载、构建和配置各种库。随着项目规模的扩大和复杂度的增加,管理和编译第三方库变得越来越困难,容易出现版本冲突和兼容性问题。
类似于Python中的第三方管理Anaconda
,开发人员可以通过Conan
轻松地下载、构建、安装和管理各种C/C++库,并将它们集成到他们的项目中。Conan支持多种操作系统和编译器,可以帮助开发人员在不同平台上管理依赖项,如果要将项目移植到新的开发环境或构建系统,Conan可以帮助快速重建项目所需的依赖关系,加快构建过程,提高项目构建的效率。
举一个例子,假设需要开发一个跨平台的C++项目,项目使用OpenCV库来处理图像。使用Conan可以很容易地在项目中集成OpenCV,并确保项目在Windows、Linux和macOS上都可以顺利构建。具体地,通过Conan搜索OpenCV库并下载安装,然后在项目中引用它,Conan会自动处理依赖关系并确保构建成功
2 Conan安装与配置
按照以下步骤进行:
- 安装conan
pip install conan conan --version
- 配置conan远程仓库
conan remote add conancenter https://center.conan.io
3 Conan的常见操作
3.1 搜索指定包
在远程仓库中搜索指定的包
conan search osqp --remote=conancenter
在
Conan
中,一个包的定义: 包名/版本@用户/渠道
也可以在Conan官网直接搜索
3.2 安装指定包
编写下列安装文件(二选一):
- 编写
conanfile.txt
[requires] osqp/0.6.3 [generators] CMakeDeps CMakeToolchain [layout] cmake_layout
- 编写
conanfile.py
from conan import ConanFile from conan.tools.cmake import cmake_layoutclass ExampleRecipe(ConanFile):settings = "os", "compiler", "build_type", "arch"generators = "CMakeDeps", "CMakeToolchain"def requirements(self):self.requires("osqp/0.6.3")def layout(self):cmake_layout(self)
接着在包含conanfile.txt
或conanfile.py
的目录执行安装命令
conan install . --build=missing
3.3 本地包管理
-
列出本地所有安装的第三方依赖
conan search
-
删除指定包
conan remove pkg/version
3.4 查看项目依赖
conan info .
4 Conan构建项目案例
项目结构如下,本文测试osqp库的conan安装
.
├── 3rd
│ ├── conanfile.py
│ ├── conaninfo.txt
│ └── conan_install.sh
├── CMakeLists.txt
└── src└── test_conan.cc
conanfile.txt
或conanfile.py
的编写与3.2节相同,启动安装脚本conan_install.sh
,其内容即为conan install . --build=missing
,这里做了一层封装
./conan_install.sh
接着编写CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(conan_test)get_filename_component(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR} DIRECTORY)
include(${CMAKE_SOURCE_DIR}/3rd/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(${PROJECT_NAME}src/test_conan.cc
)target_include_directories(${PROJECT_NAME} PUBLIC${CONAN_INCLUDE_DIRS}
)target_link_libraries(${PROJECT_NAME}${CONAN_LIBS}
)
编写测试文件
#include <osqp/osqp.h>int main(int argc, char **argv) {c_float P_x[3] = {4.0, 1.0, 2.0, }; c_int P_nnz = 3; c_int P_i[3] = {0, 0, 1, }; c_int P_p[3] = {0, 1, 3, }; c_float q[2] = {1.0, 1.0, };c_float A_x[4] = {1.0, 1.0, 1.0, 1.0, };c_int A_nnz = 4;c_int A_i[4] = {0, 1, 0, 2, };c_int A_p[3] = {0, 2, 4, };c_float l[3] = {1.0, 0.0, 0.0, };c_float u[3] = {1.0, 0.7, 0.7, };c_int n = 2;c_int m = 3;c_int exitflag = 0;OSQPWorkspace *work;OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));OSQPData *data = (OSQPData *)c_malloc(sizeof(OSQPData));if (data) {data->n = n;data->m = m;data->P = csc_matrix(data->n, data->n, P_nnz, P_x, P_i, P_p);data->q = q;data->A = csc_matrix(data->m, data->n, A_nnz, A_x, A_i, A_p);data->l = l;data->u = u;}if (settings) {osqp_set_default_settings(settings);settings->alpha = 1.0; // Change alpha parameter}exitflag = osqp_setup(&work, data, settings);osqp_solve(work);if (data) {if (data->A) c_free(data->A);if (data->P) c_free(data->P);c_free(data);}if (settings) c_free(settings);return exitflag;
}
编译测试工程
mkdir build
cd build
cmake ..
make
运行可执行文件
cd bin/
./conan_test
得到终端输出
表明链接成功
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《机器人原理与技术》
- 《机器学习强基计划》
- 《计算机视觉教程》
- …