Как использовать специфичные для Linux API и библиотеки только в сборках Linux с CMake? - PullRequest
4 голосов
/ 08 января 2012

У меня есть проект, который я запускаю в Linux (в основном), но иногда в Darwin / Mac OS X. Я использую CMake для генерации Makefile в Linux и проект Xcode в Mac OS X. До сих пор это работало хорошо.

Теперь я хочу использовать некоторые специфичные для Linux функции (clock_gettime() и связанные с ними функции).Я получаю ошибки компоновщика в Mac OS X при попытке использовать clock_gettime(), поэтому я предполагаю, что он доступен только в Linux.Я готов ввести условно скомпилированный код в файлы .c, чтобы использовать clock_gettime() в Linux и старый clock() в Mac OS.(Кстати, я планировал использовать #include <unistd.h> и #if _POSIX_TIMERS > 0 в качестве выражения препроцессора, если у кого-то нет лучшей альтернативы.)

Ситуация становится сложной, когда дело доходит до файла CMakeLists.txt.Каков предпочтительный способ введения связывания со специфичными для Linux API-интерфейсами только в сборке Linux в кроссплатформенном проекте CMake?

Примечание. В более ранней редакции этого вопроса содержались ссылки на glibc, который был слишком специфичным исбивает с толку.Вопрос в том, как правильно использовать специфичные для Linux API и библиотеки в кроссплатформенном проекте CMake.

Ответы [ 3 ]

7 голосов
/ 11 января 2012

Абстрагируясь от примеров и отвечая только на этот вопрос:

Как использовать специфичные для Linux API и библиотеки только в сборках Linux с CMake?

CMakeпредоставляет множество полезных констант , которые вы можете проверить, чтобы определить, какую систему вы используете:

if (${UNIX})
  # *nix-specific includes or actions
elsif (${WIN32})
  # Windows-specific includes or actions
elsif (${APPLE})
  # ...
endif (${UNIX})
5 голосов
/ 08 января 2012

(я знаю, что вы спрашиваете о glibc, но вы действительно хотите знать, присутствует ли clock_gettime, верно? Но ничего в вашем вопросе не относится к Linux ...)

ЕслиВы хотите проверить на clock_gettime, вы можете использовать препроцессор.Если присутствует clock_gettime, то будет определено _POSIX_TIMERS.Функция clock_gettime является частью необязательного расширения POSIX ( см. Спецификацию ), поэтому она не специфична для Linux, но и не универсальна.В Mac OS X отсутствует clock_gettime: он не объявлен ни в каком заголовке и не определен ни в одной библиотеке.

#include <time.h>
#include <unistd.h> /* for _POSIX_TIMERS definition, if present */

#if _POSIX_TIMERS
...use clock_gettime()...
#else
...use something else...
#endif

Это не решает проблему, с которой вам все равно придется связываться с -lrt вLinux.Обычно это решается с помощью что-то вроде AC_CHECK_LIB в Autoconf, я уверен, что в CMake есть эквивалент.

From man 2 clock_gettime:

В системах POSIX, в которых эти функции работаютдоступны символы, символ _POSIX_TIMERS определен в <unistd.h> до значения больше 0. Символы _POSIX_MONOTONIC_CLOCK, _POSIX_CPUTIME, _POSIX_THREAD_CPUTIME указывают, что доступны CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID.(См. Также sysconf (3).)

В Дарвине вы можете использовать функцию mach_absolute_time, если вам нужны монотонные часы с высоким разрешением.Если вам не нужно разрешение или монотонность, возможно, вам следует использовать gettimeofday на обеих платформах.

0 голосов
/ 08 января 2012

Существует также встроенный макрос CMake для проверки существования символа - CheckSymbolExists .

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