CMake CHECK_FUNCTION_EXISTS для функции, требующей #define - PullRequest
1 голос
/ 23 марта 2019

Я проект CMake, я пытаюсь проверить наличие pthread_setname_np().Что касается заголовков, этот прототип функции, кажется, открывается только в том случае, если я #define _GNU_SOURCE первый.

Возможно, по этой причине простое выполнение

CHECK_FUNCTION_EXISTS(pthread_setname_np HAVE_PTHREAD_SETNAME_NP)

не обнаружит функцию, даже если онанастоящее.В документации упоминается CMAKE_REQUIRED_DEFINITIONS, но я не уверен, как его использовать (и не совсем ли это правильно).

Как мне заставить CMake правильно определять наличие этой функции?

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Да, CMAKE_REQUIRED_DEFINITIONS - это правильный способ проверки этой функции. Вот пример его использования:

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

Вы также, вероятно, хотите прочитать это: Что означает «#define _GNU_SOURCE»?

0 голосов
/ 26 марта 2019

Это в конечном итоге сработало для меня (по крайней мере, в 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)

Важно: убедитесь, что у вас чистая среда сборки, без остатков предыдущегоbuilds. Для cmake4eclipse это означает:

  • Перейти к Проект> Свойства> Сборка C / C ++> CMake и установить Принудительно запускать CMake с каждой сборкой.(Вы можете очистить эту опцию снова после первой успешной сборки.)
  • Очистите ваш проект.

Добавление библиотеки pthread оказалось необходимым для меня, иначе она не обнаружитфункция.В некоторых системах имя библиотеки pthreads (по крайней мере, я вижу тестирование CMake для обоих);эти системы могут нуждаться в дополнительных настройках для обнаружения функции.

CHECK_FUNCTION_EXISTS вместо CHECK_SYMBOL_EXISTS также сработало бы (я пробовал оба успешно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...