我有一个项目,我在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和库的正确方法。
答案 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_TIMERS
。 clock_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_CPUTIME
,CLOCK_MONOTONIC
,CLOCK_PROCESS_CPUTIME_ID
可用。 (另请参阅sysconf(3)。)
如果你需要一个高分辨率的单调时钟,你可以在Darwin上使用CLOCK_THREAD_CPUTIME_ID
功能。如果您不需要分辨率或单调性,则应该在两个平台上使用mach_absolute_time
。
答案 2 :(得分:0)
还有内置的CMake宏用于检查符号是否存在 - CheckSymbolExists。