conan ---- C++ Package Management Tool
文章目录
教程
Cheat Sheet
快捷命令
初始化
1conan install . -if build && cmake -S . -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON编译
1cmake --build build
搜索
本地搜索
conan search <pattern, eg: boost>
远程搜索
conan search -r all boost conan search -r conan-center boost
包详情查看
conan inspect boost/1.76.0
修改 profile
conan profile update settings.compiler.libcxx=libstdc++11 default
快速用法
- 在 conancenter 中 https://conan.io/center 查找要使用的包
- 在结果页中,打开选项卡
Use it查看使用方法 例子:
验证流程
linux
- conan 版本: v1.49.0
- 安装包: boost/v1.79.0
CMakeLists.txt 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23cmake_minimum_required(VERSION 3.15) project(main CXX) # conan 配置 include(${CMAKE_BINARY_DIR}/conan_paths.cmake) find_package(Boost) message("find boost: " ${Boost_FOUND} ${Boost_DIR} ${BOOST_INCLUDE_DIRS}) add_executable(${PROJECT_NAME} hello.cpp) # 老方法 if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(main ${Boost_LIBRARIES}) endif() # 新方法 if(TARGET Boost::Boost) target_link_libraries(main Boost::Boost) endif()conanfile.txt 文件
1 2 3 4 5 6[requires] boost/1.79.0 [generators] cmake_find_package cmake_paths
conan + cmake 命令流程:
| |
Win 10
conanfile.txt
1 2 3 4 5 6[requires] boost/1.79.0 [generators] cmake_find_package cmake_pathsCMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25cmake_minimum_required(VERSION 3.15) project(main CXX) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 用来生成 compile_commands.json # conan 配置 include(${CMAKE_BINARY_DIR}/conan_paths.cmake) find_package(Boost) message("find boost: " ${Boost_FOUND} ${Boost_DIR} ${BOOST_INCLUDE_DIRS}) add_executable(${PROJECT_NAME} hello.cpp) # 老方法 if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(main ${Boost_LIBRARIES}) endif() # 新方法 if(TARGET Boost::Boost) target_link_libraries(main Boost::Boost) endif()conan 安装依赖
1conan install . -if build --build missingcmake 初始化
1cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninjalsp 支持
1cp .\build\compile_commands.json .\
generators
参考:
cmake
作用
在 conan 中完成依赖管理
- libraries 链接库依赖
- headers 头文件依赖
实现
conanfile.txt
1 2 3 4 5[requires] boost/1.76.0 [generators] cmakeCMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23CMAKE_MINIMUM_REQUIRED(VERSION 3.0) project(Hello_Demo) # conan 配置 # load conanbuildinfo.cmake include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) # 老方法------------------------ conan_basic_setup() add_executable(main main.cpp) target_link_libraries(main ${CONAN_LIBS}) # -------------------------------------------- # 新方法 modern cmake(>3.1.2) ------------------ conan_basic_setup(TARGETS) add_executable(main main.cpp) target_link_libraries(main Boost::Boost) # ---------------------------------------------
cmake_find_package
注意
- 与
cmake_pathsgenerator 一起使用
- 与
和 cmake_paths 一起使用
在 cmake 中调用
- conan install ..
- cmake ..
conanfile.txt
1 2 3 4 5 6[requires] boost/1.72.0 [generators] cmake_find_package cmake_pathsCMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21cmake_mininum_required(VERSION 3.0) project(My_Project) # load cmake_paths.cmake include(${CMAKE_BINARY_DIR}/cmake_paths.cmake) add_executable(hello hello.cpp) find_package(Boost) # 老方法 if(Boost_FOUND) include(${Boost_INCLUDE_DIRS}) target_link_libraries(hello ${Boost_LIBRARIES}) endif() # 新方法 if(TARGET Boost::Boost) target_link_libraries(hello Boost::Boost) endif()
cmake_find_package 单独使用
- 不能直接 cmake ..
而要
- conan create
cmake_find_package 单独使用,直接 cmake ..
修改 CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15CMAKE_MINIMUM_REQUIRED(VERSION 3.0) project(My_DEMO) list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}) list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}) add_executable(main main.cpp) find_package(Boost REQUIRED) if(TARGET Boost::Boost) target_link_libraries(main Boost::Boost) endif()
cmake_paths
动态链接库 dynamic link library
配置方法: 使用 options
demo:
| |
通过命令行指定
| |
conan + cmake 找到的链接库名称
Boost 为例:
CONAN_LIB::Boost_boost_unit_test_framework注意:
- 测试: Boost::boost_unit_test_framework 存在,但是 ld 链接时,发生 multiple definition 错误
判断 lib 是否存在
1 2 3 4 5 6 7 8 9 10# Global approach if(ZLIB_FOUND) include_directories(${ZLIB_INCLUDE_DIRS}) target_link_libraries (helloworld ${ZLIB_LIBRARIES}) endif() # Modern CMake targets approach if(TARGET ZLIB::ZLIB) target_link_libraries(helloworld ZLIB::ZLIB) endif()
FAQ
缺失依赖处理
参考:
问题描述:
- conan 找不到 prebuilt package(包)
快速解决方法:
conan install .. --build missing- 本地编译缺失的包
官方推荐方法:
- 创建自己的 recipe 自己编译
RPATH 在 cmake –install 时报错
例子:
| |
报错:
file RPATH_CHANGE could not write new RPATH: ... ...
解决方法: 参考:
| |
cmake uninstall target 方法
参考:
说明:
- cmake 不提供 uninstall target
快速解决方法:
1xargs rm < install_manifest.txt
文章作者
上次更新 2023-02-01 (9aed3e4)