如果版本高于cmake
,则让clang++
选择10
;否则,使用 g++
。如果 clang++
低于 10
且默认 g++
低于 10.1
,请使用 g++-10
(REQUIRED
)。
这是为了实现编译器回退。
正如本 answer 中亲切指出的,应该在 project
关键字之前设置默认编译器。
代替使用
-DCMAKE_CXX_COMPILER=clang++
或
set(CMAKE_CXX_COMPILER clang++)
我参考答案 here 使用了以下语句:
find_program(CMAKE_CXX_COMPILER
NAMES $ENV{CXX} clang++ PATHS ENV PATH NO_DEFAULT_PATH)
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
find_program(CMAKE_CXX_COMPILER
NAMES $ENV{CXX} g++ PATHS ENV PATH NO_DEFAULT_PATH)
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.1)
find_program(CMAKE_CXX_COMPILER
NAMES $ENV{g++-10} g++-10 PATHS ENV PATH NO_DEFAULT_PATH REQUIRED)
endif()
endif()
当 g++
的版本小于 clang++
时,编译器未设置为 10
,但我可以检查 cmake
是否通过了分支
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
我不明白这种行为。有没有不使用命令行参数的替代方法?
提出这个问题是为了承认不鼓励在 CMakeLists.txt
中设置编译器的事实。
@KamilCuk 提出了两种实现我所说的方法,如果他们愿意,可以采纳这些建议。
这就是我所做的。
不要在 CMakeLists.txt
中指定编译器。
这与我之前在这个问题中所做的相反。
我从 CMakeLists.txt
中删除了所有配置逻辑,并决定创建一个 shell 文件来提取编译器版本并选择合适的编译器。这种配置方式非常有名,可以在许多流行的存储库中找到,例如 ImageMagick 和 tensorflow。
答案 0 :(得分:0)
如果你想在 cmake 中编写逻辑,你可以写一些东西:
cmake_minimum_required(VERSION 3.11)
# Before project()!!!
execute_process(COMMAND clang++ --version OUTPUT_VARIABLE result)
string(REGEX REPLACE "[^0-9]* ([0-9]+).*" "\\1" clang_version "${result}") # extract the version with some regex
execute_process(COMMAND g++ --version OUTPUT_VARIABLE result)
string(REGEX REPLACE "[^0-9]* ([0-9]+).*" "\\1" gcc_version "${result}") # extract the version with some regex
# write your super condition here and set CMAKE_CXX_COMPILER depending on it
set(CMAKE_CXX_COMPILER g++)
if (gcc_version LESS 10)
set(CMAKE_CXX_COMPILER clang++)
endif()
project(blabla) # uses CMAKE_CXX_COMPILER and configures cmake
您也可以使用 include(CMakeDetermineCXXCompiler)
来确定版本,或者使用来自 CMakeCXXCompilerId.cpp.in
的 cmake 模板文件来自 CMakeDetermineCXXCompiler
内部使用的 cmake 安装路径。