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

时间:2012-01-08 02:14:22

标签: c linux macos cross-platform cmake

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

现在我想使用一些特定于Linux的函数(clock_gettime()和相关函数)。当我尝试使用clock_gettime()时,我在Mac OS X上遇到链接器错误,所以我认为它只能在Linux上使用。我准备在.c文件中引入有条件编译的代码,以便在Linux上使用clock_gettime(),在Mac OS上使用普通的clock()。 (顺便说一下,我打算使用#include <unistd.h>#if _POSIX_TIMERS > 0作为预处理程序表达式,除非有人有更好的选择。)

关于CMakeLists.txt文件,事情变得棘手。仅在跨平台CMake项目中的Linux构建下引入与特定于Linux的API的链接的首选方法是什么?

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

3 个答案:

答案 0 :(得分:7)

抽象离开你的例子,只回答这个问题:

  

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

CMake提供numerous useful constants,您可以检查以确定您正在运行的系统:

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

答案 1 :(得分:5)

(我知道你在询问glibc,但你真的想知道clock_gettime是否存在,对吗?但你的问题中没有任何内容是特定于Linux的......)

如果要检查clock_gettime,可以使用预处理器。如果存在clock_gettime,则会定义_POSIX_TIMERSclock_gettime函数是可选POSIX扩展(see spec)的一部分,因此它不是特定于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

这无法解决您仍需要在Linux上与-lrt链接的问题。这通常通过Autoconf中的AC_CHECK_LIB来解决,我确信在CMake中有相同的内容。

来自man 2 clock_gettime

  

在可以使用这些函数的POSIX系统上,符号_POSIX_TIMERS<unistd.h>中定义为大于0的值。符号_POSIX_MONOTONIC_CLOCK_POSIX_CPUTIME,{ {1}}表示_POSIX_THREAD_CPUTIMECLOCK_MONOTONICCLOCK_PROCESS_CPUTIME_ID可用。 (另请参阅sysconf(3)。)

如果你需要一个高分辨率的单调时钟,你可以在Darwin上使用CLOCK_THREAD_CPUTIME_ID功能。如果您不需要分辨率或单调性,则应该在两个平台上使用mach_absolute_time

答案 2 :(得分:0)

还有内置的CMake宏用于检查符号是否存在 - CheckSymbolExists