【发布时间】:2020-12-31 09:24:29
【问题描述】:
目标
如果clang++的版本高于10,则使cmake选择clang++;否则,使用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()
问题
当clang++ 的版本小于10 时,编译器未设置为g++,但我可以检查cmake 是否通过了分支
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
我不明白这种行为。在不使用命令行参数的情况下是否有任何替代方法?
更新
提出这个问题是为了承认不鼓励在 CMakeLists.txt 中设置编译器这一事实。
@KamilCuk 提出了两种方法来实现我所说的,如果他们愿意,可以采纳这些建议。
这就是我所做的。
TL;DR
不要在CMakeLists.txt 中指定编译器。
我的建议
这与我之前在这个问题中所做的相反。
我从CMakeLists.txt 中删除了所有配置逻辑,并决定创建一个shell 文件来提取编译器版本并选择合适的编译器。这种配置方式相当有名,在ImageMagick和tensorflow等很多流行的仓库中都能找到。
【问题讨论】:
-
想象一下没有
CMAKE_CXX_COMPILER_VERSION。你会怎么得到它?您必须自己编写代码,CMAKE_CXX_COMPILER_VERSION设置之后编译器已被选择。 -
@KamilCuk 我刚刚发现
CMAKE_CXX_COMILER_VERSION在project之前什么都没有打印出来。你是绝对正确的。我必须提供命令行参数来指定编译器吗? -
你必须在某处写出你想写的逻辑。