CMake CHECK_FUNCTION_EXISTS 用于需要#define 的函数

CMake CHECK_FUNCTION_EXISTS for a function requiring #define

我是一个 CMake 项目,我正在尝试测试 pthread_setname_np() 的可用性。至于headers,这个函数原型好像只有我先#define _GNU_SOURCE才能暴露。

大概是这个原因,干脆做了

CHECK_FUNCTION_EXISTS(pthread_setname_np HAVE_PTHREAD_SETNAME_NP)

不会检测到该函数,即使它存在。文档提到 CMAKE_REQUIRED_DEFINITIONS 但我不确定如何使用它(也不知道它是否是正确的方法)。

如何让 CMake 正确检测到此函数的存在?

是的,CMAKE_REQUIRED_DEFINITIONS 是测试此功能的正确方法。下面是它的使用示例:

set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
CHECK_FUNCTION_EXISTS(pthread_setname_np HAVE_PTHREAD_SETNAME_NP)
unset(CMAKE_REQUIRED_DEFINITIONS)

您可能还想阅读此内容:What does “#define _GNU_SOURCE” imply?

这最终对我有用(至少在 Ubuntu 18.04,目前 运行ning CI 其他人):

list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
list(APPEND CMAKE_REQUIRED_LIBRARIES pthread)
CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
list(REMOVE_ITEM CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)

重要提示:确保您有一个干净的构建环境,没有以前构建的残留物。对于 cmake4eclipse,这意味着:

  • 转到项目 > 属性 > C/C++ 构建 > CMake 并选中 Force CMake to 运行 with each build。 (您可以在第一次成功构建后再次清除该选项。)
  • 清理你的项目。

附加 pthread 库证明对我来说是必要的,否则它不会检测到该功能。库名称在某些系统上似乎是 pthreads (至少我看到 CMake 对两者进行了测试);这些系统可能需要进一步调整才能检测到该功能。

CHECK_FUNCTION_EXISTS 而不是 CHECK_SYMBOL_EXISTS 也可以(我都试过了)。