如何在 CMake 中将 C++ 标准标志作为字符串获取?

How do I get the C++ standard flag as a string in CMake?

我需要获取将用于在 CMake 中以编程方式编译目标的编译器标志。我需要将这些标志作为字符串,因为我需要将它们传递给自定义命令中的可执行文件,该命令需要知道父目标是如何编译的,因为它会传播这些标志。我知道启用编译命令会生成一个显示编译命令的 JSON,但我需要在 CMake 本身中输出。

project(foo LANGUAGES CXX)
cmake_minimum_required(VERSION 3.22)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_executable(bar bar.cpp)

# define COMPILE_FLAGS somehow such that it equals -std=c++17    

add_custom_target(external
    COMMAND external_exe --flags ${COMPILE_FLAGS}
)

我看过之前的这些问题:

我是不是遗漏了什么或者没有办法获得这些信息?

*我可以假设获取标准数字(例如 17)并将其附加到“-std=c++”将是可移植有效的吗?它至少适用于 g++ 但我不确定其他 compilers/platforms.

如果您只需要编译器标志来选择 C++ 标准,试试这个:

set(COMPILE_FLAG ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION})

或者,如果您想允许 compiler-specific 扩展,请将上面代码中的“STANDARD”替换为“EXTENSION”。

我翻阅了 CMake 源代码,发现像 CMAKE_CXX17_STANDARD_COMPILE_OPTION 这样的变量在文件中定义,告诉 CMake 如何使用不同的编译器。