如何仅在使用CMake的Linux版本上使用Linux特定的API和库?
我有一个在Linux上运行的项目(主要是在Linux上),但有时在Darwin/Mac OS X上运行。我在Linux上使用CMake生成Makefiles,在Mac OS X上使用Xcode项目。到目前为止,这个项目运行得很好 现在我想使用一些特定于Linux的函数(如何仅在使用CMake的Linux版本上使用Linux特定的API和库?,c,linux,macos,cross-platform,cmake,C,Linux,Macos,Cross Platform,Cmake,我有一个在Linux上运行的项目(主要是在Linux上),但有时在Darwin/Mac OS X上运行。我在Linux上使用CMake生成Makefiles,在Mac OS X上使用Xcode项目。到目前为止,这个项目运行得很好 现在我想使用一些特定于Linux的函数(clock\u gettime()和相关函数)。当我尝试使用clock\u gettime()时,在Mac OS X上会出现链接器错误,因此我假设它仅在Linux上可用。我准备在.c文件中引入有条件编译的代码,以便在Linux上使
clock\u gettime()
和相关函数)。当我尝试使用clock\u gettime()
时,在Mac OS X上会出现链接器错误,因此我假设它仅在Linux上可用。我准备在.c文件中引入有条件编译的代码,以便在Linux上使用clock\u gettime()
,在Mac OS上使用普通的clock()
。(顺便说一句,我计划使用#include
和#if(如果)POSIX_TIMERS>0
作为预处理器表达式,除非有人有更好的选择。)
当涉及到CMakeLists.txt文件时,事情变得棘手起来。在跨平台CMake项目中,仅在Linux构建下引入与Linux特定API的链接的首选方式是什么
注:该问题的早期版本包含对glibc的引用,过于具体和混乱。这个问题实际上是关于在跨平台CMake项目中使用Linux特定API和库的正确方法。(我知道你问的是glibc
,但你真的想知道clock\u gettime
是否存在,对吗?但你的问题中没有任何东西是Linux特定的…)
如果要检查时钟时间,可以使用预处理器。如果存在clock\u gettime
,则将定义\u POSIX\u计时器
。clock_gettime
函数是可选POSIX扩展()的一部分,因此它不是特定于Linux的,但也不是通用的。Mac OS X没有clock\u gettime
:它既没有在任何头中声明,也没有在任何库中定义
#include <time.h>
#include <unistd.h> /* for _POSIX_TIMERS definition, if present */
#if _POSIX_TIMERS
...use clock_gettime()...
#else
...use something else...
#endif
#包括
#包括/*用于_POSIX_定时器定义(如有)*/
#如果_POSIX_定时器
…使用clock_gettime()。。。
#否则
…用点别的。。。
#恩迪夫
这并不能解决您仍然必须在Linux上链接到-lrt
的问题。这通常是通过Autoconf中的AC\u CHECK\u LIB
之类的方法来解决的,我相信CMake中也有类似的方法
从man 2 clock\u gettime
:
在具有这些功能的POSIX系统上,符号\u POSIX\u定时器
在
中定义为大于0的值。符号\u POSIX\u MONOTONIC\u CLOCK
,\u POSIX\u CPUTIME
,\u POSIX\u THREAD\u CPUTIME
表示CLOCK\u MONOTONIC
,CLOCK\u PROCESS\u CPUTIME\u ID
,CLOCK\u THREAD\u CPUTIME\u ID
可用。(另见sysconf(3))
在达尔文,如果需要高分辨率的单调时钟,可以使用
马赫绝对时间
函数。如果您不需要分辨率或单调性,您可能应该在这两种平台上使用gettimeofday
。还有用于检查符号是否存在的内置CMake宏-。从示例中抽象出来,只回答以下问题:
如何仅在具有的Linux版本上使用Linux特定的API和库
克马克
CMake提供您可以检查以确定正在运行的系统:
if (${UNIX})
# *nix-specific includes or actions
elsif (${WIN32})
# Windows-specific includes or actions
elsif (${APPLE})
# ...
endif (${UNIX})
你的假设是错误的
clock_gettime
是POSIX的一部分,应该可以在任何现代兼容的操作系统上使用。@R..,我试图在Mac OS X上使用clock_gettime()
,但我收到链接器错误(问题被相应地编辑)。我遗漏了什么吗?@R..:这是POSIX扩展的一部分。@RandallCook,请注意,由于Linux上的clock\u gettime
需要-lrt
,所以在OS X上可能也需要某种标志。谢谢,Dietrich。我在编辑问题时意识到了这一点,因为glibc并不是问题的核心。请注意,链接正确的库也有问题-clock\u gettime
要求在Linux上显式链接librt
。它可能还需要OS X上的某种库,因此会出现链接器错误。@bdonlan:是的,关于-lrt
,你是对的。然而,OS X上没有clock\u gettime
。@DietrichEpp,有趣的是-OS X有头文件,但没有POSIX计时器函数库?@bdonlan:不幸的是,似乎很多人仍然允许他们的C编译器生成隐式函数声明。谢谢,@sleepy。这和我要找的很接近。我最终自己找到了一个解决方案,那就是if(UNIX而不是APPLE)。。。endif()
推断Linux是一个平台。欢迎来到Stack Overflow!