处理 conan 和 CMake 之间编译器版本的版本不匹配

Handling a version mismatch of the compiler version between conan and CMake

我正在 macOS 上开发,Apple-clang v12 是通过 Xcode 安装的默认编译器。由于 valgrind 仍然不支持 Big Sur 并且 Apple 版本不支持 Google Sanitizers 我必须通过自制软件手动安装 llvm v11.1 以利用 Google Sanitizers 启用任何内存泄漏检测工具。

不幸的是,这会导致柯南及其与 CMake 和 CLion 的集成出现一些问题,我的 IDE。由于我的依赖项不使用 clang 而不是 Apple-clang 为我的体系结构提供二进制文件,因此它们必须在本地构建。不幸的是,conan 和 CMake 在调用它们时出现两个相互矛盾的错误消息时出错:

conan install /Users/near/Code/personal/blight -if=/Users/near/Code/personal/blight/cmake-build-debug -pr=LLVM11Debug --build=missing
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Debug
compiler=clang
compiler.libcxx=libstdc++
compiler.version=11
os=Macos
os_build=Macos
[options]
[build_requires]
[env]

fmt/7.1.3: WARN: Package binary is corrupted, removing: 2284170e72f485ebb586c7bd784f294475c25e5e
conanfile.txt: Installing package
Requirements
    fmt/7.1.3 from 'conan-center' - Cache
    spdlog/1.8.5 from 'conan-center' - Cache
Packages
    fmt/7.1.3:2284170e72f485ebb586c7bd784f294475c25e5e - Build
    spdlog/1.8.5:b744aef5cdad24eec65bb267843e16ad74c9ad39 - Build

Installing (downloading, building) binaries...
fmt/7.1.3: WARN: Build folder is dirty, removing it: /Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e
fmt/7.1.3: Copying sources to build folder
fmt/7.1.3: Building your package in /Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e
fmt/7.1.3: Generator cmake created conanbuildinfo.cmake
fmt/7.1.3: Calling build()
-- The C compiler identification is AppleClang 12.0.0.12000032
-- The CXX compiler identification is AppleClang 12.0.0.12000032
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Conan: called by CMake conan helper
-- Conan: called inside local cache
-- Conan: Adjusting output directories
-- Conan: Using cmake global configuration
-- Conan: Adjusting default RPATHs Conan policies
-- Conan: Adjusting language standard
-- Conan: Adjusting fPIC flag (ON)
-- Conan: Compiler Clang>=8, checking major version 11
-- Conan: Checking correct version: 12
CMake Error at conanbuildinfo.cmake:402 (message):
  Detected a mismatch for the compiler version between your conan profile
  settings and CMake:

  Compiler version specified in your conan profile: 11

  Compiler version detected in CMake: 12.0

  Please check your conan profile settings (conan profile show
  [default|your_profile_name])

  P.S.  You may set CONAN_DISABLE_CHECK_COMPILER CMake variable in order to
  disable this check.
Call Stack (most recent call first):
  conanbuildinfo.cmake:499 (conan_error_compiler_version)
  conanbuildinfo.cmake:589 (check_compiler_version)
  conanbuildinfo.cmake:141 (conan_check_compiler)
  CMakeLists.txt:5 (conan_basic_setup)


-- Configuring incomplete, errors occurred!
See also "/Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e/build_subfolder/CMakeFiles/CMakeOutput.log".
See also "/Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e/build_subfolder/CMakeFiles/CMakeError.log".
fmt/7.1.3: 
fmt/7.1.3: ERROR: Package '2284170e72f485ebb586c7bd784f294475c25e5e' build failed
fmt/7.1.3: WARN: Build folder /Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e
ERROR: fmt/7.1.3: Error in build() method, line 63
    cmake = self._configure_cmake()
while calling '_configure_cmake', line 56
    self._cmake.configure(build_folder=self._build_subfolder)
    ConanException: Error 1 while executing cd '/Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e/build_subfolder' && cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_OSX_ARCHITECTURES="x86_64" -DCMAKE_OSX_SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk" -DCONAN_IN_LOCAL_CACHE="ON" -DCONAN_COMPILER="clang" -DCONAN_COMPILER_VERSION="11" -DCONAN_CXX_FLAGS="-m64" -DCONAN_SHARED_LINKER_FLAGS="-m64" -DCONAN_C_FLAGS="-m64" -DCONAN_LIBCXX="libstdc++" -DBUILD_SHARED_LIBS="OFF" -DCMAKE_INSTALL_PREFIX="/Users/near/.conan/data/fmt/7.1.3/_/_/package/2284170e72f485ebb586c7bd784f294475c25e5e" -DCMAKE_INSTALL_BINDIR="bin" -DCMAKE_INSTALL_SBINDIR="bin" -DCMAKE_INSTALL_LIBEXECDIR="bin" -DCMAKE_INSTALL_LIBDIR="lib" -DCMAKE_INSTALL_INCLUDEDIR="include" -DCMAKE_INSTALL_OLDINCLUDEDIR="include" -DCMAKE_INSTALL_DATAROOTDIR="share" -DCONAN_CMAKE_POSITION_INDEPENDENT_CODE="ON" -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY="ON" -DCONAN_EXPORTED="1" -DFMT_DOC="False" -DFMT_TEST="False" -DFMT_INSTALL="True" -DFMT_LIB_DIR="lib" -Wno-dev '/Users/near/.conan/data/fmt/7.1.3/_/_/build/2284170e72f485ebb586c7bd784f294475c25e5e'
"/Users/near/Library/Application Support/JetBrains/Toolbox/apps/CLion/ch-0/203.7717.62/CLion.app/Contents/bin/cmake/mac/bin/cmake" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -G "CodeBlocks - Unix Makefiles" /Users/near/Code/personal/blight
-- The CXX compiler identification is Clang 11.1.0
-- Check for working CXX compiler: /usr/local/opt/llvm/bin/clang++
-- Check for working CXX compiler: /usr/local/opt/llvm/bin/clang++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Conan: Adjusting output directories
-- Conan: Using cmake global configuration
-- Conan: Adjusting default RPATHs Conan policies
-- Conan: Adjusting language standard
-- Current conanbuildinfo.cmake directory: /Users/near/Code/personal/blight/cmake-build-debug
CMake Error at cmake-build-debug/conanbuildinfo.cmake:626 (message):
  Detected a mismatch for the compiler version between your conan profile
  settings and CMake:

  Compiler version specified in your conan profile: 12.0

  Compiler version detected in CMake: 11.1

  Please check your conan profile settings (conan profile show
  [default|your_profile_name])

  P.S.  You may set CONAN_DISABLE_CHECK_COMPILER CMake variable in order to
  disable this check.
Call Stack (most recent call first):
  cmake-build-debug/conanbuildinfo.cmake:728 (conan_error_compiler_version)
  cmake-build-debug/conanbuildinfo.cmake:813 (check_compiler_version)
  cmake-build-debug/conanbuildinfo.cmake:365 (conan_check_compiler)
  CMakeLists.txt:13 (conan_basic_setup)


-- Configuring incomplete, errors occurred!
See also "/Users/near/Code/personal/blight/cmake-build-debug/CMakeFiles/CMakeOutput.log".

这是在 CLion 的 CMake 输出 window 中看到的输出。第一次调用让 CMake 认为 Apple-clang 是我的编译器,而柯南配置为使用 llvm 版本,在第二步(很可能由我的 CMakeLists.txt 中的 conan_basic_setup 调用)选择了正确的 CMake 编译器但柯南最终没有配置文件,因此版本不匹配。

在 CLion 设置中,我已经用 llvm v11.1 编译器覆盖了 c++ 编译器:

正确配置两者以使用 llvm v11.1 编译器的正确解决方案是什么?我个人不想启用 CONAN_DISABLE_CHECK_COMPILER CMake 变量,因为不清楚最终将使用哪个编译器来编译依赖项。

之前发布的问题只是建议故意使用更高版本,这不是我想要的:

我在您的日志文件中看到的两个包 spdlog 和 fmt 都可以作为 header 仅配置使用。 因此,如果这些是您唯一的依赖项,您可以简单地设置选项以仅使用它们 header,这将消除问题,因为没有任何东西可以为这些包构建。

这样做的一种方法是将设置添加到您使用的配置文件中,添加到选项部分,就像那样

[options]
fmt:header_only=True
spdlog:header_only=True

尽管首先禁用了柯南集成,但我还是找到了解决方案。有了一个干净的构建目录,我进入了那里,不得不手动调用柯南,如下所示:

CC=clang CXX=clang++ conan install .. -pr=LLVM11Debug --build=missing

之后,可以 运行 使用在 CLion 的 UI 中配置的 CMake 和 clang 11 进行构建。问题是 Conan 集成插件没有提供使用环境变量设置编译器的直接方法,也没有从 CLion 的工具链选项中获取编译器。