避免在Conan配置文件和CMake之间重复配置

避免在Conan配置文件和CMake之间重复配置,cmake,conan,Cmake,Conan,我一直在学习柯南的一个个人项目,我有一个问题,我无法回答从看文件和例子 柯南的“简介”和CMake之间似乎缺乏互动,这让人感到尴尬。我的意思是:有许多不同的构建参数必须手动保持同步-使用不同于在conan安装期间选择的参数运行CMake将导致构建错误 举一个更具体的例子,下面是我的两个配置,以及我将如何使用它们来构建: $ cat ~/.conan/profiles/gcc_debug [settings] os=Linux os_build=Linux arch=x86_64 arch_bui

我一直在学习柯南的一个个人项目,我有一个问题,我无法回答从看文件和例子

柯南的“简介”和CMake之间似乎缺乏互动,这让人感到尴尬。我的意思是:有许多不同的构建参数必须手动保持同步-使用不同于在
conan安装期间选择的参数运行CMake将导致构建错误

举一个更具体的例子,下面是我的两个配置,以及我将如何使用它们来构建:

$ cat ~/.conan/profiles/gcc_debug
[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
compiler=gcc
compiler.version=10
compiler.libcxx=libstdc++11
build_type=Debug
[options]
[build_requires]
[env]

$ export CC=/usr/bin/gcc
$ export CXX=/usr/bin/g++
$ conan install ../src --profile gcc_debug
$ cmake ../src -GNinja -DCMAKE_BUILD_TYPE=Debug
$ cmake --build .
在第一个示例中,我必须重复
gcc
Debug

在第二个例子中,我必须重复
visualstudio
16
ClangCL
,以及
Release

重复这么多次让我感觉很难受,特别是当这些选项分布在多个长时间运行的命令中时,忘记一个选项可能会导致不明显的错误消息。在我看来,当你调用
CMake_basic_setup()
时,Conan不只是强制(覆盖)适当的CMake变量,这也很奇怪;它已经知道它期望的值是什么,如果它们不匹配,它就会爆炸


推荐的处理方法是什么?

我刚刚开始研究,这似乎很有希望。我最初跳过了这个,因为它看起来只适用于那些发布柯南软件包的人,但现在我认为它也适用于消费者。事实上,甚至明确提到我的问题陈述:

conan构建
将使用
conan安装
中使用的设置,这些设置已缓存在本地
conaninfo.txt
和构建文件夹中的文件中。这简化了过程,并减少了安装的软件包与当前项目配置之间不匹配的错误。[…]实现和使用conanfile.py
build()
方法可确保我们在安装需求和构建项目时始终使用相同的设置,并简化对构建系统的调用


通常,您会使用Conan设置所有外部库,然后从CMake使用它们。但是,您可以采用另一种方法:让CMake调用Conan来安装外部依赖项

示例代码来自:


啊,好主意。我得调查一下。
$ cat ~/.conan/profiles/clang_cl_release
[settings]
os=Windows
os_build=Windows
arch=x86_64
arch_build=x86_64
compiler=Visual Studio
compiler.version=16
compiler.toolset=ClangCL
build_type=Release
[options]
[build_requires]
[env]

$ conan install ../src --profile clang_cl_release
$ cmake ../src -G"Visual Studio 16 2019" -TClangCL
$ cmake --build . --config=Release
cmake_minimum_required(VERSION 2.8)
project(myproject CXX)

# Download automatically, you can also just copy the conan.cmake file
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
   message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
   file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/master/conan.cmake"
                  "${CMAKE_BINARY_DIR}/conan.cmake")
endif()

include(${CMAKE_BINARY_DIR}/conan.cmake)

conan_cmake_run(REQUIRES Catch2/2.6.0@catchorg/stable
                BASIC_SETUP)

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