【问题标题】:Does CMake support glibc feature test macrosCMake 是否支持 glibc 功能测试宏
【发布时间】:2017-08-30 00:12:58
【问题描述】:

假设我想使用特定的 Linux / POSIX 功能,该功能基于feature test macros 有条件地提供。例如类型cpu_set_t、宏CPU_SET_ZERO、函数sched_setaffinity

理想情况下,我只想告诉 CMake 我需要这些,并且它应该找出要设置的额外功能测试宏,或者如果当前系统上无法提供它,它会失败并显示一个很好的错误消息。这可能吗?

我知道我可以在themanpages 中查找并手动使用add_definitions(-D_GNU_SOURCE),但是一旦组合了在不同版本的 POSIX 标准中引入和弃用的多个功能,这可能会变得乏味。根据我的经验,在不同版本的 glibc 实现之间保持可移植性会变得很困难。

CMake platform checks,但它们似乎只有助于检查。所以我在cmake 而不是make 期间得到了错误,但我仍然需要手动找出正确的功能测试宏。

cmake-compile-features 似乎只提供与编译器直接相关的功能,而不是库。

【问题讨论】:

    标签: linux cmake posix glibc portability


    【解决方案1】:

    如果您只是想确定一个函数或变量是否存在,您可以使用CheckSymbolExists 模块。同样,结构有CheckStructHasMember(假设有一个标准成员可以检查)。所以:

    include (CheckSymbolExists)
    include (CheckStructHasMember)
    
    CHECK_SYMBOL_EXISTS(CPU_SET_ZERO sched.h CPU_SET_ZERO_exists)
    CHECK_SYMBOL_EXISTS(sched_setaffinity sched.h sched_setaffinity_exists)
    CHECK_STRUCT_HAS_MEMBER(cpu_set_t <member?> sched.h cpu_set_t_exists)
    

    看来cpu_set_t 是一种不透明类型,因此您可以使用CheckCXXSourceCompiles 模块,它是try_compile 命令的前端。这是确定任何特定代码是否编译的通用方法。 try_compile 被'base' CMake 广泛用于确定功能(尝试在 Modules 目录中搜索!)。本质上,您将它传递到一个最小的源文件中,如果您的功能不存在,该文件应该会编译失败,并将结果报告回您的 CMake 脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2013-07-15
      • 2018-09-21
      • 2013-09-16
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      相关资源
      最近更新 更多