c++ - 使用 CMake 获取预处理器定义值

标签 c++ cmake c-preprocessor

使用 CMake 获取 C 预处理器定义的值是否有一种不完全 hacky 的方法?例如,我可能想做这样的事情来获得准确的 MSVC 版本。

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    get_preprocessor_value("_MSC_FULL_VER" msvc_version)
    if (msvc_version LESS 190023918)
        message(FATAL_ERROR "Visual C++ 2015 Update 2 or later is required due to a bug in std::atomic.")
    endif ()
    target_compile_definitions(mytarget PRIVATE "_ENABLE_ATOMIC_ALIGNMENT_FIX")
endif ()

我编写了 get_preprocessor_value()。是否有一个功能可以做到这一点,或者有一种简单的方法可以做到这一点。显然,我可以让 CMake 编译一个简单的程序来打印它,并捕获标准输出,但我想知道是否有一个内置函数可以为我做这件事。

最佳答案

没有内置的 CMake 函数可以做到这一点,CMake 也没有附带 standard module做那样的事情。

对于编译器版本的特殊情况,CMake 有变量 CMAKE_<LANG>_COMPILER_VERSION (例如 C++ 的 CMAKE_CXX_COMPILER_VERSION)。

如果该变量没有为您提供足够的信息,您最好的选择是使用 try_run() 正如您在问题中提到的那样,编译并打印宏的值。我一点也不觉得这有问题,我想说这实际上是在 CMake 中做类似事情的一种非常惯用的方式。

关于c++ - 使用 CMake 获取预处理器定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44410526/

相关文章:

c - 在纯 C 函数中使用字符串作为结构名称的可变部分

c++ - 如何在不实例化的情况下将堆栈对象移动到std::shared_ptr

c++ - 无法从 C++ 中的链接列表中的对象检索值

c++ - CMake 和 FIND_PACKAGE

cmake - 使用 CMake 更改包含文件的参数

有条件地使用带有 armcc 的打包结构(BGLib 中的 PACKSTRUCT)

c - 转向预处理器以避免间接

c++ - istream 与内存映射文件?

c++ - 将字符串转换为 long long int

cmake - CMake 占位符如何工作?