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和库的正确方法.
从您的示例中抽象出来,并回答这个问题:
如何仅在使用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)
(我知道你在询问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在两个平台上使用.
| 归档时间: |
|
| 查看次数: |
2337 次 |
| 最近记录: |