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
也可以(我都试过了)。
我是一个 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
也可以(我都试过了)。