为什么CMAKE_C_COMPILER_VERSION报告的版本错误?clang 13未使用但已设置变量/未使用但设置参



在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,请参阅下面的答案。

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

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

最新更新