【问题标题】:Why is CMAKE_C_COMPILER_VERSION reporting the wrong version? clang 13 unused-but-set-variable/unused-but-set-parameter check为什么 CMAKE_C_COMPILER_VERSION 报告错误的版本? clang 13 未使用但设置变量/未使用但设置参数检查
【发布时间】:2021-12-25 16:26:31
【问题描述】:

在 CI 机器上,我让 cmake 在开始时回显一些基本的编译器变量。将 clang 从 12 更新到 13 后,我在这里看到了两个版本:

-- CMAKE_C_COMPILER: /usr/local/bin/clang
-- CMAKE_C_COMPILER_ID: Clang
-- CMAKE_C_COMPILER_VERSION: 12.0.0
clang version 13.0.0 (/tmp/llvm-project/clang d7b669b3a30345cfcdb2fde2af6f48aa4b94845d)
-- CMAKE_CXX_COMPILER: /usr/local/bin/clang++
-- CMAKE_CXX_COMPILER_ID: Clang
-- CMAKE_CXX_COMPILER_VERSION: 12.0.0
clang version 13.0.0 (/tmp/llvm-project/clang d7b669b3a30345cfcdb2fde2af6f48aa4b94845d)

请注意,“13.0.0”来自通过这些 cmake 函数实际运行 clang --version

message(STATUS "CMAKE_C_COMPILER: " ${CMAKE_C_COMPILER} )
message(STATUS "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
message(STATUS "CMAKE_C_COMPILER_VERSION: ${CMAKE_C_COMPILER_VERSION}")
execute_process(COMMAND ${CMAKE_C_COMPILER} ${COMPILER_VERSION_ARG} )

可能相关的其他信息:

-- CMake version: 3.18.1-g262b901
-- Using ccache.
-- Using sanitizer: address

这个问题变得相关,因为一些后来的构建步骤在检查编译器版本时失败,因此做出了错误的决定。是否有一些本地缓存可能导致这种奇怪的行为?据我了解,这不应该依赖于缓存吗?

更新:我放弃了 CMAKE_C_COMPILER_VERSION 检查并改用了 check_c_compiler_flag,请参阅下面的答案。

【问题讨论】:

  • "将 clang 从 12 更新到 13 后" - 更新 clang 后是否清除了 CMake 缓存?例如通过删除项目的构建目录。 “13.0.0 来自实际运行 clang --version” - 由于 CMake 找到 /usr/local/bin/clang,我最好运行 /usr/local/bin/clang -- version 进行检查。
  • 我澄清了关于clang --version 的部分以及为什么它是同一个可执行文件。您是说允许 CMake 缓存编译器版本并且不会注意到它何时获得重大更新?那宁愿是香蕉,不是吗?

标签: c++ c cmake clang


【解决方案1】:

CMake 找到 /usr/local/bin/clang,而不是 /tmp/llvm-project/clang。您可能需要显式设置 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 以确保 CMake 找到您打算使用的 Clang。

【讨论】:

  • /tmp/llvm-project/clang 是运行 clang --version 时版本字符串的一部分,所以不,不是这样。
  • 你检查过 CMakeCache 的实际使用路径吗?通过设置变量来强制编译器是否有帮助?
  • 这是一个 CI 盒子,这样的东西是有限的。此外,我无法再访问旧日志,因此无法进一步调查。
【解决方案2】:

Clang 13 引入了两项新的检查,这些检查破坏了一些外部库。与其检查 clang 版本,不如做一个功能检查:

# clang 13 introduced stricter checks, for now, disable the warning:
include(CheckCCompilerFlag)
check_c_compiler_flag(-Wno-unused-but-set-variable HAS_UNUSED_BUT_SET_VARIABLE)
if (HAS_UNUSED_BUT_SET_VARIABLE)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
endif()

当然,这同样适用于-Wno-unused-but-set-parameter。对于 C++,也可以使用 CheckCxxCompilerFlag/check_cxx_compiler_flag

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多