如何仅在使用CMake的Linux版本上使用特定于Linux的API和库?

Ran*_*ook 4 c linux macos cross-platform cmake

我有一个项目,我在Linux(主要)上运行,但有时在Darwin/Mac OS X上运行.我使用CMake在Linux上生成Makefiles,在Mac OS X上生成Xcode项目.到目前为止,这个项目运行良好.

现在我想使用一些特定于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文件时,事情变得棘手.仅在跨平台CMake项目中的Linux构建下引入与特定于Linux的API的链接的首选方法是什么?

注意:此问题的早期版本包含对glibc的引用,这些内容过于具体且令人困惑.问题实际上是在跨平台CMake项目中使用特定于Linux的API和库的正确方法.

Olh*_*hay 7

从您的示例中抽象出来,并回答这个问题:

如何仅在使用CMake的Linux版本上使用特定于Linux的API和库?

CMake提供了许多有用的常量,您可以检查这些常量以确定您正在运行的系统:

if (${UNIX})
  # *nix-specific includes or actions
elsif (${WIN32})
  # Windows-specific includes or actions
elsif (${APPLE})
  # ...
endif (${UNIX})
Run Code Online (Sandbox Code Playgroud)


Die*_*Epp 5

(我知道你在询问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
Run Code Online (Sandbox Code Playgroud)

这并没有解决您仍然需要-lrt在Linux 上链接的问题.这通常用类似于AC_CHECK_LIBAutoconf的东西来解决,我确信在CMake中有相同的东西.

来自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在两个平台上使用.