Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅在使用CMake的Linux版本上使用Linux特定的API和库?_C_Linux_Macos_Cross Platform_Cmake - Fatal编程技术网

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

如何仅在使用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上使

我有一个在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()
,在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!