CMake CHECK_FUNCTION_EXISTS用于需要#define的函数

时间:2019-03-23 18:37:02

标签: cmake pthreads

我是CMake项目,我正在尝试测试import React from 'react; import PageVisibility from 'react-page-visibility'; class YourComponent extends React.Component { state = { isWindowInFocus: true, } componentDidMount() { const { isWindowInFocus } = this.props; if (!isWindowInFocus) { // do something } } listentoWindow = isVisible => { this.setState({ isWindowInFocus: isVisible, }); } render() { return ( <PageVisibility onChange={this.listentoWindow}> <div> Your component JSX </div> </PageVisibility> ); } } 的可用性。至于标题,只有在我首先server { // works root /var/www/nwb-dashboard/dist; server_name blaque.live www.blaque.live; index index.html index.htm; // doesnt work location /settings/ { alias /var/www/nwb-dashboard/dist; index index.html index.htm } } 时才会公开此函数原型。

可能是因为这个原因,简单地做

pthread_setname_np()

即使存在,也不会检测到该功能。文档中提到了#define _GNU_SOURCE,但我不确定如何使用(也不是完全正确的方法)。

如何让CMake正确检测此功能的存在?

2 个答案:

答案 0 :(得分:1)

是的,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?

答案 1 :(得分:0)

这最终对我有用(至少在Ubuntu 18.04上,当前正在为其他人运行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 ,然后选中强制CMake与每个构建一起运行。 (您可以在首次成功构建后再次清除该选项。)
  • 清理您的项目。

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

CHECK_FUNCTION_EXISTS而不是CHECK_SYMBOL_EXISTS也会很好(我都尝试成功了)。